Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/413.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Promise.all([])返回已解决的承诺,但Promise.race([])返回挂起的承诺。为什么它们不同?_Javascript_Promise_Es6 Promise - Fatal编程技术网

Javascript Promise.all([])返回已解决的承诺,但Promise.race([])返回挂起的承诺。为什么它们不同?

Javascript Promise.all([])返回已解决的承诺,但Promise.race([])返回挂起的承诺。为什么它们不同?,javascript,promise,es6-promise,Javascript,Promise,Es6 Promise,如果使用非空数组调用Promise.all或Promise.race,它们将返回一个挂起的承诺: console.log(Promise.all([1])); // prints Promise {<pending>} console.log(Promise.race([1])); // returns Promise {<pending>} console.log(Promise.race([])); // prints Promise {<pending>

如果使用非空数组调用Promise.all或Promise.race,它们将返回一个挂起的承诺:

console.log(Promise.all([1]));
// prints Promise {<pending>}
console.log(Promise.race([1]));
// returns Promise {<pending>}
console.log(Promise.race([]));
// prints Promise {<pending>}
console.log(Promise.all([1]);
//打印承诺{}
console.log(Promise.race([1]);
//返回承诺{}
如果使用空数组调用Promise.race,它将返回一个挂起的承诺:

console.log(Promise.all([1]));
// prints Promise {<pending>}
console.log(Promise.race([1]));
// returns Promise {<pending>}
console.log(Promise.race([]));
// prints Promise {<pending>}
console.log(Promise.race([]);
//打印承诺{}
但如果使用空数组调用Promise.all,它将返回一个已解析的Promise:

console.log(Promise.all([]));
// prints Promise {<resolved>: Array(0)}
console.log(Promise.all([]);
//打印承诺{:数组(0)}
为什么Promise.所有功能都是这样设计的?似乎没有什么好的理由来解释这种不一致,但也许我遗漏了什么。

来自:

如果iterable参数为空,或者如果iterable中的任何承诺都没有得到解决,则此方法返回的挂起承诺将永远不会得到解决


在这方面,
Promise.all()
规范不太容易遵循,但基本上,当您向它传递一个空数组时,它从它们所称的
0
remaingementscont
开始,这让它可以立即解析

当您在
Promise.all([1])
中向它传递一个值时,它很可能会将该值包装在
Promise.resolve()
中,然后跟踪
.then()
处理程序,该处理程序将在下一次勾选时解析,因此
控制台.log(Promise.all([1])
显示它在下一次勾选之前仍然挂起


从逻辑上讲,这是有道理的
Promise.race()。唯一的其他选项是拒绝或解析为未定义的
,或引发无效使用的异常。我不太清楚为什么设计师会选择他们所做的结果,而不是这些其他选择,但至少在规范中有明确的详细说明

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

为什么Promise.所有功能都是这样设计的

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

但是,有人可以提出这样一个论点:如果你有一个可变长度的数组,你需要等待它完成
Promise.all()
,那么无论数组中有20项还是0项,函数都应该工作。对于
0
length数组,它将在下一个刻度上立即解析,这既有用又一致,因为没有等待的承诺,而且有一个适合且一致的解析值(空数组)


ES6主题讨论

这里有一个链接,指向关于
Promise.race()
永不解决:。当然也有人不同意目前的实施

我个人的观点(在关于这个话题的各种讨论中,其他一些人也这么认为)是,它应该抛出一个例外,因为它基本上是一个无效的条件,从发展的角度来看,“快速失败且引人注目”比无限的承诺要好得多。但是,显然有更多的人喜欢它现在的样子

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

来自:

如果iterable参数为空,或者如果iterable中的任何承诺都没有得到解决,则此方法返回的挂起承诺将永远不会得到解决


在这方面,
Promise.all()
规范不太容易遵循,但基本上,当您向它传递一个空数组时,它从它们所称的
0
remaingementscont
开始,这让它可以立即解析

当您在
Promise.all([1])
中向它传递一个值时,它很可能会将该值包装在
Promise.resolve()
中,然后跟踪
.then()
处理程序,该处理程序将在下一次勾选时解析,因此
控制台.log(Promise.all([1])
显示它在下一次勾选之前仍然挂起


从逻辑上讲,这是有道理的
Promise.race()。唯一的其他选项是拒绝或解析为未定义的
,或引发无效使用的异常。我不太清楚为什么设计师会选择他们所做的结果,而不是这些其他选择,但至少在规范中有明确的详细说明

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

为什么Promise.所有功能都是这样设计的

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

但是,有人可以提出这样一个论点:如果你有一个可变长度的数组,你需要等待它完成
Promise.all()
,那么无论数组中有20项还是0项,函数都应该工作。对于
0
length数组,它将在下一个刻度上立即解析,这既有用又一致,因为没有等待的承诺,而且有一个适合且一致的解析值(空数组)


ES6主题讨论

这里有一个链接,指向关于
Promise.race()
永不解决问题的开发讨论