Node.js - обещания в цикле - PullRequest
0 голосов
/ 28 июня 2018

У меня есть эта проблема для обработки вложенных обещаний и циклов:

firstPromise().then(function(resultOfFirstPromise){
    var promiseArray = [];
    for(var i = 0; i < 10; i++){
      var ret = secondoPromise();
      promiseArray.push(ret);
    }
    return Promise.all(promiseArray);
}, function(error){
    console.log("firstPromiseError");
}).then(function(resultOfSecondPromise){
    console.log(i); //but obviously i = 10
}, function(error){
    console.log("secondPromiseError");
});

То, что я хочу сделать, это иметь значение индекса цикла i в каждом .then каждого secondPromise: вывод моего кода должен выглядеть примерно так:
0 1 2 3 4 5 6 7 8 9 10.

Ответы [ 3 ]

0 голосов
/ 29 июня 2018

Просто соедините then вызовы secondoRomise(), а также используйте let в цикле:

firstPromise().then(function(resultOfFirstPromise){
   var promiseArray = [];
   for(let i = 0; i < 10; i++){
     var ret = secondoPromise();
     promiseArray.push(ret);
     ret.then(result => console.log("Promise No." + i + " returned " + result);
   }
   return Promise.all(promiseArray);
}).then(() => console.log("all done!"));
0 голосов
/ 29 июня 2018

Это просто проблема с областью, потому что, когда вы создаете новую функцию, она создает новую область, так что вы не можете получить доступ к одной области из другой, это похоже на создание нового класса в Javascript. Это та же самая причина, когда вы создаете функцию, вам часто приходится создавать переменную для ссылки на это (например, const self = this). Вы можете обойти это, используя функции стрелок ES6, поскольку при их использовании он не создает новый класс / область видимости.

firstPromise().then( (resultOfFirstPromise) => {
    var promiseArray = [];
    for(var i = 0; i < 10; i++){
      var ret = secondoPromise();
      promiseArray.push(ret);
    }
    return Promise.all(promiseArray);
}, (error) => {
    console.log("firstPromiseError");
}).then( (resultOfSecondPromise) => {
    console.log(i); //but obviously i = 10
}, (error) => {
    console.log("secondPromiseError");
});

Что-то в этом роде, возможно, вам придется немного подыскать.

0 голосов
/ 29 июня 2018

То, что вы пытаетесь достичь, невозможно с Promise. В цепочке .then() один .then() запускается только после выполнения всех его предыдущих .then(). Это означает, что если .then() завершил работу, он никогда не будет работать снова.

Я не знаю ваш вариант использования, но то, что вы пытаетесь сделать, достижимо, используя Rxjs/Observables

let arr = [1, 2, 3, 4, 5];

    Rx.Observable.from(arr)
        .do((v) => {
            /*do some thing*/
            console.log(v)
        })
        .do((v) => {
            /*do another things*/
            console.log(v)
        });

В приведенном выше коде обратный вызов внутри каждого do() будет выполняться для каждого элемента arr.

Output

 1
 1
 2
 2
 3
 3
 4
 4
 5
 5 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...