繁体   English   中英

解决for循环中的promise

[英]Resolving promises inside for loop

我正在尝试使用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
       })
   }
}

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

您可以这样做;

 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)); 

你可以使用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

您可以通过多种方式完成此操作。 我们还可以使用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);    
    } 
}

你可以这样做..

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)
       })
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM