解决for循环中的promise

时间:2016-09-03 16:22:48

标签: javascript node.js promise

我正在尝试使用for循环来读取JSON对象以格式化JSON数据,并通过将格式化的响应放入模型对象将其发送回客户端。

在for循环中,我基于几个条件处理两个承诺。有两个函数,每个函数都有一个promise返回。如何在所有promise都解决之后获取我的最终数据?提前谢谢。

for (var i = 0, i<jsonData.length; i++){
   if(someCOndition){
       getSomeData().then(function(data){
          //some operation using data
       })
   }
  if(someOtherCOndition){
       getSomeOtherData().then(function(data){
          //some operation using data
       })
   }
}

5 个答案:

答案 0 :(得分:7)

标准JS Promises(ES2015 +)的情况下,

Promise.all([ promise1, promise2 ])Promise.all() on MDN)。它返回一个新的promise,一旦所有传递的promises得到解决,它就会得到解决。但要注意 - 当至少一个承诺被拒绝时,它会立即被拒绝(它不会等待任何其他承诺)。

答案 1 :(得分:4)

您可以执行以下操作;

&#13;
&#13;
var promises = [],
  JSONData_1 = ["chunk_11","chunk_12","chunk_13"],
  JSONData_2 = ["chunk_21","chunk_22","chunk_23"],
 getJSONData = (b,i) => new Promise((resolve,reject) => setTimeout(_ => b ? resolve(JSONData_1[i])
                                                                          : resolve(JSONData_2[i]),1000));

for (var i = 0; i < JSONData_1.length; i++){
   if(Math.random() < 0.5) promises.push(getJSONData(true,i));
   else promises.push(getJSONData(false,i));
}
Promise.all(promises)
       .then(a => console.log(a));
&#13;
&#13;
&#13;

答案 2 :(得分:1)

您可以使用jQuery.when()。

  var deferredList = [];
    for (var i = 0, i<jsonData.length; i++){
       if(someCOndition){

         deferredList.push(getSomeData().then(function(data){
         //some operation using data
         }))
        }
   if(someOtherCOndition){

       taskList.push(getSomeOtherData().then(function(data){
        //some operation using data
       }))
    }
   }
 JQuery.when(taskList).done(function(){
      // final to do..
 }).fail(){
    // even if single one fails ! be aware of this
   }

jQuery.when() MDN

答案 3 :(得分:0)

您可以通过多种方式进行操作。如果需要,我们还可以将for循环与async..await一起使用,以在循环时同步获取结果。像这样:

function downloadPage(url) {    
    return Promise.resolve('some value'); 
}

async function () {    
    for(let url of urls) {
       let result = await downloadPage(url);
       // Process the result 
       console.log(result);    
    } 
}

答案 4 :(得分:-1)

你可以这样做..

var arr=[],arr2=[];
for (var i = 0, i<jsonData.length; i++){
   if(someCOndition){
       //push onto the array inputs for getSomeData()
       arr.push(jsonData[i]);
   }
  if(someOtherCOndition){
       arr2.push(jsonData[i]);
   }
}

processArr(0);
processArr2(0);

function processArr(idx){
    if (idx>=arr.length) {
        //done
    }
    else {
        getSomeData().then(function(data){
          // some operation using data
          // optionally store in a results array

          // recurse
          processArr(idx+1)

       })
    }
}

function processArr2(idx){
    if (idx>=arr2.length) {
        //done
    }
    else {
        getSomeotherData().then(function(data){
          // some operation using data

          // recurse
          processArr2(idx+1)
       })
    }
}