我有这个问题来处理嵌套的承诺和循环:
{% 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。
答案 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");
});
类似的事情,您可能需要稍作调整。