如何让Promise.all按预期执行我的承诺?

时间:2018-04-27 15:52:12

标签: javascript node.js promise

我正在试图了解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()
];

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

我所期待的是创建一个Promise集合,直到调用Promise.all才会运行。

请解释如何实现我的期望或解释我对Promise.all的理解是否有缺陷或告诉我我应该如何创造我的承诺。

我对执行这一系列承诺的无数其他方式不感兴趣。我只是想了解Promise.all应该如何处理Promise集合,在我不希望Promlet.all执行之前运行promise代码的情况下。

1 个答案:

答案 0 :(得分: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));