当前位置: 首页 > 知识库问答 >
问题:

All([])返回已解决的promise,而promise.race([])返回挂起的promise。为什么他们不一样?

充修能
2023-03-14

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

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([]));
// prints Promise {<resolved>: Array(0)}

为什么promise。所有功能都是这样设计的?似乎没有很好的理由不一致,但也许我错过了什么。

共有1个答案

荆利
2023-03-14

来自promise.race()的EMCA脚本规范:

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

在这方面,promise.all()规范不太容易遵循,但基本上当您传递给它一个空数组时,它从0RemainingElementsCount开始,这使得它可以立即解析。

从逻辑上讲,这是有道理的。promise.race()应该解析为要解析的第一个promise的值,但是如果不传递任何内容,那么实际上就没有第一个解析的值。唯一的其他选项是拒绝或解析为undefined,或者抛出无效用法的异常。我不太清楚为什么设计者选择了他们所做的结果而不是这些其他选择,但至少在规范中有明确的详细说明。

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

为什么promise。所有功能都是这样设计的?

要真正“了解”设计者的逻辑,你必须询问他们中的一个,或者参加过讨论,或者找到讨论逻辑的邮件列表。

但是,可以设置一个参数,如果您有一个可变长度的数组,其中包含要用promise.all()完成的内容,那么无论数组中有20项还是0项,该函数都应该工作。对于0长度数组,它将在下一个刻度时立即解析,这将是有用和一致的,因为没有promise要等待,并且有一个解析值(空数组)适合且一致。

ES6专题讨论

下面是关于promise.race()从不解析的开发讨论的链接:https://github.com/domenic/promises-unwrapping/issis/75。当然有人不同意目前的实施。

我个人的观点(在关于这个主题的各种讨论中,其他一些人也有同感)是,它应该抛出一个异常,因为它基本上是一个无效的条件,从开发的角度来看,“快速而明显地失败”比无限的promise要好得多。但是,显然有更多的人喜欢它的方式。

Bluebird文档建议使用promise.any()而不是promise.race(),部分原因是它没有这种行为。

 类似资料:
  • 我试图使用promise通过XHR发出异步请求。我可以从内部将结果记录到console.log中,然后在外部返回pending。 是一个数组,当我使用console.log(result)时,它看起来很好<但是,code>console.log(newResult)返回一个挂起的promise。

  • 问题内容: 背景 我正在尝试学习承诺,并且我有一个希望改进的承诺链。 问题 在学习如何链接承诺时,我看不到为什么有人愿意返回承诺而不是返回其价值。 以下面的示例为例,该示例使用了Promise链接: 在这里,我必须链接2次。但是,如果我直接从方法中返回结果而不是返回Promise,则可能会执行以下操作: 问题 如您所见,我有些困惑。 鉴于实际上是异步的,是否有可能实现与我的第二个代码示例中的代码相

  • 问题内容: 我正在努力克服JavaScript(特别是AngularJS)中的承诺。 我在服务中有一个函数,我们称它为,它检查是否已加载一些数据。如果有,我只希望它返回,否则,我们需要加载数据并返回promise: 我有另一个函数,然后调用如下函数: 我在这里的问题是,如果我们不需要在函数中加载数据,则不会返回promise,因此在其他函数中不会调用the 。这里的方法应该是什么-基本上,如果我们

  • 我从JS开始,实际上喜欢异步方面(来自Python),但我不确定为什么有些函数返回Promise。具体来说,下面使用的代码让我想知道返回了什么: 除了流之外,我们在之后得到的HTTP响应是一个文本块,客户端稍后会对其进行解释,以提取标题、正文和其他有趣的元素,作为HTTP内容分析的一部分。 关键是这个文本块是一块的,所以第一个已经有了整个响应——为什么JSON主体的解析是异步操作,不同于第二个?

  • 问题内容: 我的代码: 当我尝试运行这样的东西时: 我越来越: 但为什么? 我的主要目标是将令牌(从令牌中返回承诺)转换为变量。然后才执行一些操作。 问题答案: 只要其结果尚未解决,promise将始终记录未决。无论promise状态如何(已解决或仍处于待处理状态),您都必须调用promise来捕获结果: 这是为什么? 承诺只是向前的方向;您只能解决一次。a的解析值传递给其或方法。 根据Promi

  • 我最近一直在摆弄api,并注意到一些有点古怪的东西。 返回一个对象。http://jsbin.com/wofulo/2/edit?js输出 但是,如果写为: 这里是一个标准的,您可以访问title属性 所以我的问题是:为什么在对象文本中返回一个promise,但是如果刚刚返回,则返回值?