Maison  >  Article  >  interface Web  >  Analyse du code source de la promesse es6

Analyse du code source de la promesse es6

不言
不言avant
2019-03-23 10:03:182814parcourir

Le contenu de cet article concerne l'analyse du code source d'es6-promise. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer.

Logique principale :

Essentiellement, c'est toujours la même chose que la fonction de rappel.
La distinction entre asynchrone et synchrone se complète par le jugement des _abonnés.
Complétez le flux de la chaîne then via la résolution, rejetez -> publiez -> invoquezCallback -> > Fonction en synchronisation Flux : constructeur -> résolveur -> puis -> invoquerCallback

Flux de fonction dans les situations asynchrones : constructeur -> 🎜>

Analyse de la fonction principale

1. Fonctions du constructeur

 : Lier la résolution et le rejet au résolveur -


2 puis
constructor(resolver) {
    this[PROMISE_ID] = nextId();
    this._result = this._state = undefined;
    this._subscribers = [];
    <!-- 判断resolver是不是一个空对象 -->
    if (noop !== resolver) {
      typeof resolver !== 'function' && needsResolver();
      <!-- 把resolve,reject绑定到 resolver上-->
      this instanceof Promise ? initializePromise(this, resolver) : needsNew();
    }
  }

Fonction : Liez la fonction de rappel à _subscribers. Catch et enfin sont essentiellement du sucre syntaxique pour then Le paramètre de _subscribers est un tableau, [0] est son enfant, lié au parent de la chaîne then suivante, utilisé pour l'appel récursif de publication. , le deuxième est le rappel de résolution, le troisième est le rappel de rejet

3 publication
export default function then(onFulfillment, onRejection) {
  const parent = this;
  <!-- 用于then链的返回值,下一条then就是当前parent的child -->
  const child = new this.constructor(noop);

  if (child[PROMISE_ID] === undefined) {
    makePromise(child);
  }

  const { _state } = parent;
 <!-- 判断_state的状态,是不是PENDING -->
  if (_state) {
    const callback = arguments[_state - 1];
    asap(() => invokeCallback(_state, child, callback, parent._result));
  } else {
    subscribe(parent, child, onFulfillment, onRejection);
  }

  return child;
}

Fonction : résoudre, le déclenchement du rejet appellera la publication, la publication continuera à appelez EnsureCallback , continuez à appeler solve et rejetez via la valeur de retour, formant une récursion pour terminer le flux de la chaîne then

astuce :
function publish(promise) {
  let subscribers = promise._subscribers;
  let settled = promise._state;

  if (subscribers.length === 0) { return; }

  let child, callback, detail = promise._result;

  for (let i = 0; i < subscribers.length; i += 3) {
    child = subscribers[i];
    callback = subscribers[i + settled];

    if (child) {
      invokeCallback(settled, child, callback, detail);
    } else {
      callback(detail);
    }
  }

  promise._subscribers.length = 0;
}

finalement, le rappel n'a pas de retour paramètres, basés sur
Cet article est terminé ici Pour un contenu plus passionnant, vous pouvez faire attention à la colonne

Tutoriel vidéo JavaScript
return promise.then(value => constructor.resolve(callback()).then(() => value),
                         reason => constructor.resolve(callback()).then(() => { throw reason; }));
du site Web PHP chinois !

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer