承诺实现-为什么需要将处理程序存储为数组?

时间:2019-05-03 02:25:40

标签: javascript promise

我正在研究https://www.promisejs.org/implementing/

中简单承诺的实现

我在这里得到了大多数东西...但是我不确定为什么这个特殊的例子需要将处理程序存储为数组。

如果仅通过以下代码在状态为PENDING时才推送数组

function handle(handler) {
  if (state === PENDING) {
    handlers.push(handler);
  } else {
    if (state === FULFILLED &&
      typeof handler.onFulfilled === 'function') {
      handler.onFulfilled(value);
    }
    if (state === REJECTED &&
      typeof handler.onRejected === 'function') {
      handler.onRejected(value);
    }
  }
}

但是如果我们在调用状态之前通过以下方式立即满足并更改状态=!PENDING,

function fulfill(result) {
  state = FULFILLED;
  value = result;
  handlers.forEach(handle);
  handlers = null;
}

function reject(error) {
  state = REJECTED;
  value = error;
  handlers.forEach(handle);
  handlers = null;
}

即使完成被称为非常规

this.done = function (onFulfilled, onRejected) {
  // ensure we are always asynchronous
  setTimeout(function () {
    handle({
      onFulfilled: onFulfilled,
      onRejected: onRejected
    });
  }, 0);
}

我看不到处理程序将如何具有多个元素,因为无论何时处理,无论是否在其中处理另一个进程,我们都将始终观察新的Promise对象。

即在什么情况下,我们将要求在同一诺言下存储多个成功和失败处理程序?

我没看到它。

请帮助我理解

1 个答案:

答案 0 :(得分:0)

确实,承诺链不会在链的头部(第一个承诺)添加“附加处理程序”。

对于承诺链,链中的每个.then.catch都会返回 new Promise,因此,对于Promise链,您是正确的只需要一个“处理程序”

但是,任何Promise都可以具有多个“侦听器” ...即,您可以多次调用其.then方法... .then返回的诺言是新的,但是{{ 1}}仍然是相同的承诺,因此在其上调用的任何p都将添加为处理程序

.then