gpt4 book ai didi

javascript - Node : Is behavior well-defined for Promise. 都带有非 Promise 值?

转载 作者:太空宇宙 更新时间:2023-11-04 03:04:54 24 4
gpt4 key购买 nike

docs for Promise.all() 将参数描述为 Promise 数组。如果数组中的部分(或全部)元素是非 Promise 值,是否定义了行为?例如,在 Node 6.10.2 中:

Promise.all([1, 2, 3]).then(
res => console.log(res)
);

按预期打印 [ 1, 2, 3 ]。这种行为(其中 Promise.all 使用与调用时相同的值进行解析)在 Node 中是否得到保证

最佳答案

Promise.all() ES6 规范中指定。

看起来 section 24.4.4.1.1 in that ES6 specification在步骤 6.i 描述了迭代中的每个项目如何传递到 Promise.all()被传递给一个 Promise 构造函数(本质上是调用 Promise.resolve(item) ),以便任何非 Promise 都被包装在一个 Promise 中,该 Promise 将在下一个刻度时自行解决。

您需要了解这些步骤如何工作的整体上下文才能完全理解,但具体的 6.i 步骤是这样的:

Let nextPromise be Invoke(constructor, "resolve", «‍nextValue»).

哪里constructor (在这种情况下)是 PromiseInvoke()正在调用 resolve方法 - 所以它本质上是在做:

let nextPromise = Promise.resolve(nextValue);

这就是将可迭代对象中的每个项目包装在 Promise 中(如果它还不是 Promise)的方式。

然后,稍后在步骤 6.r 中,它会执行以下操作:

Let result be Invoke(nextPromise, "then", «‍resolveElement, resultCapability.[[Reject]]»).

这就是它调用的地方 .then()nextPromise即使可迭代中的项目最初不是 promise ,现在也可以正常工作,因为它已被包装在新的 promise 中。

并且,在 24.4.4.5 Promise.resolve(x)的描述如下:

The resolve function returns either a new promise resolved with the passed argument, or the argument itself if the argument is a promise produced by this constructor.

因此,您可以看到该值被包装在一个新的 Promise 中(如果它还不是 Promise)。

<小时/>

Is this behavior (where Promise.all() resolves with the same values that it was called with) guaranteed in Node?

是的,如果这些值不是 promise ,那么它将使用相同值的数组进行解析。这将是一个不同的数组,但新数组中的值相同。如果任何值是 Promise,那么显然,最终数组包含该 Promise 的解析值。这是由规范保证的。

关于javascript - Node : Is behavior well-defined for Promise. 都带有非 Promise 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43881565/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com