【问题标题】:Does an array of promises only start executing once passed to promise all?一组承诺是否只有在传递给所有承诺后才开始执行?
【发布时间】:2017-09-21 15:44:13
【问题描述】:

如果构建了一组承诺然后将其传递给Promise.all,是立即开始执行还是只在调用Promise.all 时开始执行?

示例代码:

let promises: Promise<string> [] = [this.methodCall(), this.methodCall(), this.methodCall()];

 Promise.all(promises).then(values => {
  ...
 }).catch(error => {
  ...
 }); 

另外,这个代码示例会捕获所有拒绝吗?

【问题讨论】:

  • 关于你的第二个问题......也许只是阅读documentation它以第一个拒绝的承诺的原因拒绝。
  • “它以第一个拒绝的承诺的原因拒绝”,我认为这意味着它仍然处理其他承诺拒绝。
  • Promise.all() 与任何其他 Promise 函数一样,只会返回一个解析或拒绝类型的结果。因此,一旦传递给Promise.all() 的任何一个承诺被拒绝,它将立即返回拒绝,您不应该等待或期待任何其他解决方案。如果您需要单独处理拒绝,那么您可能需要通过其他方式(如减少等)对您的承诺进行排序。
  • 可以Promise.all() 导致UnhandledPromiseRejectionWarning,因为多个承诺可能会被拒绝?
  • 我“猜测”UnhandledPromiseRejectionWarningUncaught (in promise) 可能是同一件事(node vs chrome),这可能不适用于Promise.all() 中剩余的拒绝承诺。这是关于你不是.catch()ing 拒绝。

标签: javascript typescript promise


【解决方案1】:

在创建Promise 时,它会立即开始工作。查看日志。 Promise 主体功能起作用,然后在 5 秒后启动 Promise.all

const pr = new Promise((resolve, reject) => {
  console.log('Started !!!');
  resolve();
});

console.log('Before setTimeout');

setTimeout( () => {
  Promise.all([pr]).then(result => console.log('Resolved !!!'));
}, 5000)

console.log('After setTimeout');

来自Documentation

使用参数 resolve 和 reject 传递的函数。这 executor 函数由 Promise 立即执行 实现,传递解析和拒绝函数(执行者是 在 Promise 构造函数之前调用,甚至返回创建的 对象)。

【讨论】:

    猜你喜欢
    • 2018-06-27
    • 2016-01-10
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-02
    • 1970-01-01
    相关资源
    最近更新 更多