Node.js-循环中的承诺

时间:2018-06-28 20:26:14

标签: javascript node.js promise

我有这个问题来处理嵌套的承诺和循环:

{% if form.non_field_errors %}
    {% for error in form.non_field_errors %}
        <div class="alert alert-danger">{{ form.non_field_errors }}</div>
    {% endfor %}
{% endif %}

我想做的是在每一秒的每个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承诺:我的代码输出应如下所示:
0 1 2 3 4 5 6 7 8 9 10。

3 个答案:

答案 0 :(得分:0)

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

只需将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!"));

答案 2 :(得分:0)

这只是一个范围问题,因为当您创建一个新函数时,它会创建一个新范围,因此您不能从另一个范围访问一个范围,其作用类似于在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");
});

类似的事情,您可能需要稍作调整。