【问题标题】:How do I get Promise.all to execute my promises as expected?如何让 Promise.all 按预期执行我的承诺?
【发布时间】:2018-10-08 12:25:28
【问题描述】:

我正在尝试了解 Promise.all 的工作原理,它似乎应该很简单。我的理解是 Promise.all 接受一组承诺,然后同时执行它们。

这是我编写的一些代码,我通过节点 (8.10.0) 执行,我预计它们会正常工作:

const getFirstPromise = function() {
    return new Promise((resolve, reject) => {
        setTimeout(function(){
            console.log("1");
            resolve("First!"); // Yay! Everything went well!
        }, 2500);
    });
};

const getSecondPromise = function() {
    return new Promise((resolve, reject) => {
        setTimeout(function(){
            console.log("2");
            resolve("Second!"); // Yay! Everything went well!
        }, 250);
    });
};

const getThirdPromise = function() {
    return new Promise((resolve, reject) => {
        setTimeout(function(){
            console.log("3");
            resolve("Third!"); // Yay! Everything went well!
        }, 1000);
    });
};

const getFourthPromise = function () {
    return new Promise((resolve, reject) => {
        setTimeout(function(){
            console.log("4");
            resolve("Fourth!"); // Yay! Everything went well!
        }, 500);
    });
};

const tasks = [
    getFirstPromise,
    getSecondPromise,
    getThirdPromise,
    getFourthPromise
];

Promise.all(tasks).then((result) => console.log("Done alling the promises: ", result)).catch(err => console.log(err));

正如所写,这不会执行任何承诺。

如果我将任务集合更改为如下所示:

const tasks = [
    getFirstPromise(),
    getSecondPromise(),
    getThirdPromise(),
    getFourthPromise()
];

然后所有的承诺都会执行,但如果我注释掉 Promise.all 行,它们仍然会执行。

我期待的是创建一个 Promise 的集合,直到 Promise.all 被调用。

请解释如何实现我的期望,或者解释我对 Promise.all 的理解有什么缺陷,或者告诉我应该如何创建我的承诺。

我对执行这一系列承诺的无数其他方式不感兴趣。我只想了解在 Promise.all 执行之前我不希望 promise 代码运行的情况下 Promise.all 应该如何与一组 promise 一起工作。

【问题讨论】:

  • 嗯,快速的回答是只在调用Promise.all([ wrapper1(), wrapper2(), ... ]) 时调用你的包装器,因为Promise.all 只是封装了所有的promise 并返回一个promise,所以你不必做Promise.then(() => Promise.then( ... ))递归,这看起来真的很糟糕。它不知道包装函数,它需要 Promise 已初始化的对象。
  • 我只是想了解在 Promise.all 执行之前我不希望 Promise 代码运行的情况下 Promise.all 应该如何处理 Promise 集合。 i> 这不是 Promise 被指定的行为方式。 stackoverflow.com/questions/42118900/…
  • 一次性处理所有决议(或拒绝)。
  • “Promise.all 有什么意义?”“等待”多个 Promise 解决。
  • Promise.all() 不运行任何东西。它所做的一切都是监控您已经开始的活动。因此,如果您不希望您的异步操作在以后开始,那么不要在以后开始它们。一旦你声明了你的tasks 结构,你就会启动它们。这与Promise.all() 毫无关系。您调用函数的时间比您希望它们运行的​​时间早。

标签: javascript node.js promise


【解决方案1】:

你可以使用这个函数代替 Promise.all

var Task = {
   all: function(tasks) {
      return Promise.all(tasks.map((task) => task()));
   }
};

并使用

const tasks = [
    getFirstPromise,
    getSecondPromise,
    getThirdPromise,
    getFourthPromise
];

Task.all(tasks).then((result) => console.log("Done alling the promises: ", result)).catch(err => console.log(err));

【讨论】:

  • 这通常是我解决我的实际工作相关问题的方法,这些问题最初促使我这样做,但它并不像我最初尝试做的那样令人满意。 :) 我认为@somethinghere 的第一条评论阐明了我最初错过的问题。
猜你喜欢
  • 2021-12-20
  • 1970-01-01
  • 1970-01-01
  • 2018-09-03
  • 2019-02-05
  • 1970-01-01
  • 2017-05-17
  • 2018-09-19
  • 2022-01-17
相关资源
最近更新 更多