编程语言
首页 > 编程语言> > javascript-为什么Promise.all(array)无法立即解决?

javascript-为什么Promise.all(array)无法立即解决?

作者:互联网

我在计算机上安装以下代码示例(安装了Node 5.8.0)并获得下一个结果(请参见代码示例之后).

代码示例:

'use strict'

var p1 = Promise.resolve();
var p2 = Promise.resolve();

var p12 = Promise.all([p1, p2]);

var cb = function() {
  console.log(p12);
}

setTimeout(cb, 0);

console.log(p1);
console.log(p2);
console.log(p12);

结果:

承诺{未定义}
承诺{未定义}
承诺{< pending> }
承诺{[undefined,undefined]}

为什么为什么在p1和p2之后不能立即解析p12(在程序开始时给出p1和p1的解析结果)?为什么“超时”的p12被解析了?
Promise.all(array)得到解决需要一些时间吗?

解决方法:

根据promise规范,在事件循环结束其当前周期之后,总是异步调用promise满足或拒绝处理程序.因此,即使p12的参数都是已解决的承诺,也不会立即解决它.因此,直到此事件循环结束后不久,它才会得到解决.这解释了为什么您的第一条陈述:

console.log(p12);

表明诺言仍在“待决”中.当前尚未调用.then()处理函数(如果有).但是,一旦当前代码线程完成执行,并且控制权返回事件队列中的下一个事件,则将解决promise,因此您的setTimeout()会在那时将其视为已解决.

这样做是出于调用者一致性的原因,因此无论是否已解决了承诺,都以异步方式一致地调用.then()处理程序.这使调用代码可以始终一致地进行编码,而不必担心诺言是否已被解决.在所有情况下,.then()处理函数都会在当前堆栈展开并完成后调用.

Promises/A+ specification开始:

onFulfilled or onRejected must not be called until the execution
context stack contains only platform code.

Here “platform code” means engine, environment, and promise
implementation code. In practice, this requirement ensures that
onFulfilled and onRejected execute asynchronously, after the event
loop turn in which then is called, and with a fresh stack. This can be
implemented with either a “macro-task” mechanism such as setTimeout or
setImmediate, or with a “micro-task” mechanism such as
MutationObserver or process.nextTick. Since the promise implementation
is considered platform code, it may itself contain a task-scheduling
queue or “trampoline” in which the handlers are called.

因此,所有这一切的结果就是保证始终在当前执行线程完成后异步解析.尽管内部细节可能比这要复杂一些(也许涉及微任务),但是您可以从逻辑上考虑通过将一条消息发布到事件队列中来解决已被解决/拒绝的诺言,从而实现诺言.而且,只要事件队列完成了当前正在运行的操作并轮到运行promises .then()处理程序,它们就会执行.

标签:node-js,promise,es6-promise,settimeout,javascript
来源: https://codeday.me/bug/20191027/1942759.html