gpt4 book ai didi

javascript - Promise.all([]) 返回已解决的 Promise,但 Promise.race([]) 返回待处理的 Promise。为什么它们不同?

转载 作者:行者123 更新时间:2023-12-01 02:09:24 30 4
gpt4 key购买 nike

如果使用非空数组调用 Promise.all 或 Promise.race,它们将返回一个待处理的 Promise:

console.log(Promise.all([1]));
// prints Promise {<pending>}
console.log(Promise.race([1]));
// returns Promise {<pending>}

如果使用空数组调用 Promise.race,它将返回一个待处理的 Promise:

console.log(Promise.race([]));
// prints Promise {<pending>}

但是如果使用空数组调用 Promise.all,它会返回一个已解决的 Promise:

console.log(Promise.all([]));
// prints Promise {<resolved>: Array(0)}

为什么Promise.all函数要这样设计?似乎没有充分的理由造成这种不一致,但也许我遗漏了一些东西。

最佳答案

来自EMCA Script specification for Promise.race() :

If the iterable argument is empty or if none of the promises in iterable ever settle then the pending promise returned by this method will never be settled

<小时/>

在这方面,Promise.all() 规范并不是那么容易遵循,但基本上当你向它传递一个空数组时,它会以他们所说的 remainingElementsCount0,使其立即解析。

当您向其传递一个值(如 Promise.all([1]) 中的值时),它可能会将该值包装在 Promise.resolve() 中,然后跟踪.then() 处理程序将在下一个价格变动时解析,因此 console.log(Promise.all([1])) 显示它在下一个价格变动之前仍处于待处理状态.

<小时/>

从逻辑上讲,这是有一定道理的。 Promise.race() 应该解析为第一个要解析的 Promise 的值,但是如果你不传递任何东西,那么实际上就没有第一个解析的值。唯一的其他选项是拒绝或解析为“未定义”或抛出无效使用的异常。我不太清楚为什么设计师选择他们所做的结果与其他选择相比,但至少在规范中清楚地详细说明了这一点。

另一方面,

Promise.all() 可以很好地解析为空数组,这是传递空数组的逻辑结果。

Why was the Promise.all function designed like this?

要真正“了解”设计者的逻辑,您必须询问其中之一,或者参与过讨论,或者查找讨论逻辑的邮件列表讨论。

但是,有人可以提出这样的论点:如果您有一个可变长度的数组,您想要等待使用 Promise.all() 完成,那么无论数组有 20 个,该函数都应该起作用其中的项目或 0。对于 0 长度的数组,它只会在下一个刻度时立即解析,这既有用又一致,因为没有 promise 等待,并且有一个适合且一致的解析值(空数组)。

<小时/>

ES6主题讨论

这里有一个关于 Promise.race() 从 Unresolved 开发讨论的链接:https://github.com/domenic/promises-unwrapping/issues/75 。当然有人不同意当前的实现。

我个人的观点(在该主题的各种讨论中由其他一些人分享)是它应该抛出异常,因为它基本上是一个无效条件,并且从开发的 Angular 来看“快速失败且引人注目”比无限的 promise 。但是,显然有更多的人喜欢它本来的样子。

Bluebird docs建议使用他们的 Promise.any() 而不是 Promise.race(),部分原因是它没有这种行为。

关于javascript - Promise.all([]) 返回已解决的 Promise,但 Promise.race([]) 返回待处理的 Promise。为什么它们不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49849679/

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