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.use
promiseArray.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");
});