Javascript Node.js-循环中的承诺
我有这个问题来处理嵌套的承诺和循环:Javascript Node.js-循环中的承诺,javascript,node.js,promise,Javascript,Node.js,Promise,我有这个问题来处理嵌套的承诺和循环: firstPromise().then(function(resultOfFirstPromise){ var promiseArray = []; for(var i = 0; i < 10; i++){ var ret = secondoPromise(); promiseArray.push(ret); } return Promise.all(promiseArray); }, funct
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");
});
firstPromise().then(函数(resultOfFirstPromise){
var promiseArray=[];
对于(变量i=0;i<10;i++){
var ret=secondoPromise();
承诺推送(ret);
}
返回承诺。全部(承诺人数组);
},函数(错误){
console.log(“firstPromiseError”);
}).then(函数(resultOfSecondPromise){
console.log(i);//但显然i=10
},函数(错误){
console.log(“secondPromiseError”);
});
我想做的是在每一个中都有循环索引值I
。然后每一秒的承诺:我的代码的输出应该是这样的:
01 2 3 4 5 6 7 8 9 10。你想要实现的目标是不可能的。在.then()
的链中,只有在所有以前的.then()
都完成之后,才会运行一个.then()
。也就是说,如果一个.then()
已经完成运行,它将永远不会再运行
我不知道您的用例,但您尝试使用
在上面的代码中,每个do()
内部的回调将针对arr
的每个元素运行
输出
:
1
1
2
2
3
3
4
4
5
5
只需将调用链接到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!"));
firstPromise().then(函数(resultOfFirstPromise){
var promiseArray=[];
for(设i=0;i<10;i++){
var ret=secondoPromise();
承诺推送(ret);
ret.then(result=>console.log(“承诺号”+i+“返回”+result”);
}
返回承诺。全部(承诺人数组);
})。然后(()=>console.log(“全部完成!”);
这只是一个作用域问题,因为当你创建一个新函数时,它会创建一个新的作用域,因此你无法从另一个作用域访问它,它的行为有点像在Javascript中创建一个新类。这与创建一个函数时,你经常需要创建一个变量来引用它(例如,const self=This)的原因完全相同。您可以使用ES6 arrow函数来解决这个问题,因为在使用它们时,它不会创建新的类/作用域
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");
});
firstPromise()。然后((resultOfFirstPromise)=>{
var promiseArray=[];
对于(变量i=0;i<10;i++){
var ret=secondoPromise();
承诺推送(ret);
}
返回承诺。全部(承诺人数组);
},(错误)=>{
console.log(“firstPromiseError”);
}).然后((resultOfSecondPromise)=>{
console.log(i);//但显然i=10
},(错误)=>{
console.log(“secondPromiseError”);
});
诸如此类,您可能需要稍微弄虚作假。如果可以使用ES6,只需使用(让i=0)而不是(var i=0)。此外,在您的代码片段中没有显示如何使用i.usepromiseArray.push(Promise.resolve(i));
然后resultOfSecondPromise
将是一个从0到9的数字数组。如果您想在then
函数中使用它,您需要使用i
来解决您的承诺。这感觉像是您简化了问题的问题,这通常是一件好事,但是您能解释一下为什么需要这样做吗这样做?可能还有另一种解决问题的方法。是的,我同意@dougajmcdonald。不清楚为什么需要使用另一个范围的for循环的索引,而通常情况下,您根本无法到达该范围。
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");
});