Fei*_*anZ 0 javascript node.js promise
所述文档为Promise.all()描述参数作为承诺的阵列。如果数组中的某些(或全部)元素是非 Promise 值,行为是否已定义?例如,在 Node 6.10.2 中:
Promise.all([1, 2, 3]).then(
res => console.log(res)
);
Run Code Online (Sandbox Code Playgroud)
打印[ 1, 2, 3 ],如预期。在 Node 中是否保证这种行为(Promise.all使用与调用时相同的值解析)?
Promise.all() 在 ES6 规范中指定。
似乎ES6 规范第 6.i 步中的第 24.4.4.1.1 节描述了传递给的可迭代对象中的每个项目如何Promise.all()传递给承诺构造函数(本质上是调用Promise.resolve(item)),以便任何非承诺都包含在承诺中,该承诺将在下一个滴答声中自行解决。
您需要遵循这些步骤如何工作的整体上下文才能完全理解,但具体的 6.i 步骤是这样的:
让 nextPromise 成为 Invoke(constructor, "resolve", «?nextValue»)。
constructor (在这种情况下)在哪里Promise并且Invoke()正在调用resolve它的方法 - 所以它本质上是在做:
let nextPromise = Promise.resolve(nextValue);
Run Code Online (Sandbox Code Playgroud)
如果迭代中的每个项目还不是承诺,那么它就是如何包装在承诺中的。
然后,稍后在步骤 6.r 中,它会执行以下操作:
令结果为 Invoke(nextPromise, "then", «?resolveElement, resultCapability.[[Reject]]»)。
这是它调用.then()上nextPromise现在将正常工作,即使在该项目迭代最初不是一个承诺,因为它已经被包裹在一个新的承诺。
并且,在24.4.4.5 中的描述Promise.resolve(x)如下:
resolve 函数要么返回一个用传递的参数解析的新承诺,要么返回参数本身,如果参数是由此构造函数生成的承诺。
因此,您可以看到,如果该值还不是一个承诺,则该值被包装在一个新的承诺中。
Promise.all()在 Node 中是否保证这种行为(使用与调用时相同的值解析)?
是的,如果值不是承诺,那么它将使用相同值的数组进行解析。它将是一个不同的数组,但新数组中的值相同。如果任何值是承诺,那么显然,最终数组包含该承诺的解析值。这是由规范保证的。
| 归档时间: |
|
| 查看次数: |
88 次 |
| 最近记录: |