Как заставить Promise.all выполнить свои обещания, как ожидалось? - PullRequest
0 голосов
/ 27 апреля 2018

Я пытаюсь понять, как работает 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.all.

Пожалуйста, либо объясните, как добиться того, чего я ожидаю, ИЛИ объясните, как мое понимание Promise.all является ошибочным, или скажите, как еще мне следует создавать свои обещания.

Меня не интересует множество других способов выполнения этой серии обещаний. Я просто хочу понять, как Promise.all должен работать с коллекцией обещаний, если я не хочу, чтобы код обещания выполнялся до тех пор, пока не будет выполнен Promise.all.

1 Ответ

0 голосов
/ 27 апреля 2018

Вы можете использовать эту функцию вместо 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));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...