Maison > interface Web > js tutoriel > [Javascript] Code source de zepto Analyse de rappel

[Javascript] Code source de zepto Analyse de rappel

php是最好的语言
Libérer: 2018-08-06 15:21:18
original
1650 Les gens l'ont consulté

Le module Callback est utilisé pour gérer les fonctions de rappel et constitue également la partie de base de l'objet Deferred Delay. Jetons maintenant un œil à son code source.
Paramètres facultatifs :

  Options:
    once: 是否最多执行一次,
    memory: 是否记住最近的上下文和参数
    stopOnFalse: 当某个回调函数返回false时中断执行
    unique: 相同得回调只被添加一次
Copier après la connexion

Il s'agit d'un paramètre facultatif, vous pouvez le tester ci-dessous :

var a = function (value) {
  console.log('a:' + value);
};
var b = function (value) {
  console.log('b:' + value);
};
var callbacks = $.Callbacks();
callbacks.add(a);
callbacks.fire(['hello']);
callbacks.add(b);
callbacks.fire('中');
Copier après la connexion

Voici sa sortie :

a: hello,
a:中,
b:中
Copier après la connexion

Vous pouvez voir que lorsque nous tirerons pour la deuxième fois, la fonction a sera également exécutée.
Lors de l'ajout de paramètres pour les expériences, ajoutez d'abord de la mémoire

var callbacks = $.Callbacks({
  memory: true
});
callbacks.add(a);
callbacks.fire('hello');
callbacks.add(b);
输出:
a:hello,
b:hello
Copier après la connexion

Ajoutez le paramètre de mémoire. La mémoire enregistre la dernière fois que la fonction de rappel a été déclenchée. Toutes les fonctions ajoutées par la suite seront exécutées immédiatement à l'aide de ce paramètre. En regardant l'utilisation d'une fois

var callbacks = $.Callbacks({
  once: true
});
callbacks.add(a);
callbacks.fire('hello');
callbacks.fire('中');
输出:
a:hello
Copier après la connexion

, nous pouvons voir que bien que la méthode fire soit exécutée deux fois, le résultat n'est affiché qu'une seule fois. Les deux autres paramètres sont faciles à comprendre, vous pouvez donc essayer les détails vous-même.

$.Callbacks = function(options) {
  options = $.extend({}, options)
  var memory, 
    fired, 
    firing,
    firingStart,
    firingLength,
    firingIndex,
    list = [],
    stack = !options.once && []
}
Copier après la connexion

Regardez la signification de chaque paramètre. La mémoire se souviendra du contexte et des paramètres du dernier déclencheur en mode mémoire, ce qui signifie que le rappel a été déclenché, ce qui signifie que le rappel est déclenché. Tâche de rappel FireStart La position de départ, la longueur de la tâche de rappel FireLength, l'index du rappel actuel dans FireIndex et la liste représentent la véritable file d'attente de rappel. Si elle n'est pas déclenchée une seule fois, elle est utilisée pour mettre en cache les paramètres de la tâche qui sont. non exécuté pendant le processus de déclenchement.

fire = function(data) {
  memory = options.memory && data
  fired = true
  firingIndex = firingStart || 0
  firingStart = 0
  firingLength = list.length
  firing = true
  for ( ; list && firingIndex < firingLength ; ++firingIndex ) {
    if (list[firingIndex].apply(data[0], data[1]) === false && options.stopOnFalse) {
      memory = false
      break
    }
  }
  firing = false
  if (list) {
    if (stack) stack.length && fire(stack.shift())
    else if (memory) list.length = 0
    else Callbacks.disable()
  }
}
Copier après la connexion

La fonction fire est la seule fonction intégrée. Sa fonction est de déclencher l'exécution du rappel de la liste. Tout d'abord, jetons un œil aux paramètres qu'elle transmet. Ce n'est pas la même chose. comme le feu que nous appelons $.Callbacks en externe. C'est à peu près la même chose, data ici est un tableau, data[0] représente le contexte et data[1] est le paramètre de l'appel de méthode. Ensuite, il y a l'initialisation de chaque paramètre, memory signifie que si options.memory est vrai, les données sont enregistrées et le déclenchement est vrai. Si FireStart est 0, alors FireIndex est 0, FireStart est défini sur 0 et la marque de rappel de déclenchement. le tir est vrai.
Parcourez ensuite la liste de rappel et exécutez les rappels un par un. Le jugement if à l'intérieur de cela signifie que si la fonction de rappel renvoie false et que options.stopOnFalse est false, le cache mémoire sera vidé. Une fois le parcours terminé, modifiez l'état d'exécution sur false. Si la liste existe et que la pile existe également, supprimez les paramètres de la tâche et appelez la fonction fire pour l'exécuter. Si de la mémoire existe, effacez la liste, sinon l'exécution du rappel est effectuée

Enfin, ce fichier renvoie des rappels. Jetons un coup d'œil à son implémentation spécifique :

Callbacks = {
  add: function () {
    if (list) {
      var start = list.length,
        add = function (args) {
          $.each(args, funciton(_, arg) {
            if (typeof arg === &#39;function&#39;) {
              if (!options.unique || !Callbacks.has(arg)) list.push(arg);
            } else if (arg && arg.length && typeof arg !== &#39;string&#39;) add(arg);
          })
        }
      add(arguments)
      if (firing) firingLength = list.length;
      else if (memory) {
        firingStart = start;
        fire(memory)
      }
    }
    return this;
  }
}
Copier après la connexion

La fonction principale de cette fonction. est comme le rappel push dans la liste. Tout d'abord, déterminez si la liste existe. Si elle existe, start se voit attribuer la longueur de la liste et une méthode add est ajoutée en interne. La méthode add interne consiste principalement à ajouter un rappel à la liste si le paramètre que nous transmettons est. un tableau, la méthode add est appelée à nouveau. Appelez ensuite la méthode add et transmettez les arguments. Si le rappel est en cours, corrigez la longueur de la tâche de rappel FireLength à la longueur de la liste de tâches actuelle afin que les fonctions de rappel ajoutées ultérieurement puissent être exécutées. Si de la mémoire existe, définissez le début sur la première position dans la liste nouvellement ajoutée, puis appelez le feu.
Jetons un coup d'œil au fonctionnement de fireWith :

fireWith: function(context, args) {
  if (list && (!fired || stack)) {
    args = args || [];
    args = [context, args.slice ? args.slice() : args];
    if (firing) stack.push(args);
    else fire(args);
  }
  return this;
}
Copier après la connexion

Les paramètres transmis dans le contexte d'inclusion et la liste de paramètres. La condition d'exécution de la fonction est que la liste existe et que le rappel n'est pas exécuté ou que la pile existe et que la pile peut être vide. Tout d’abord, réaffectez args[0] est le contexte et args[1] est la liste copiée. Si le rappel est en cours, ajoutez des arguments à la pile ou exécutez simplement des arguments.

Articles associés :

Introduction au module Gesture dans le code source de Zepto

Une brève analyse de la méthode Callback en Javascript

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal