解决循环内的承诺

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

在for循环中,我正在处理基于几个条件的两个promise。 有两个函数,每个函数都有返回的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() )。 它返回一个新的承诺,一旦所有的承诺都得到解决,就会得到解决。 但请注意 – 至less有一个承诺被拒绝时,它会立即被拒绝(不会等待任何其他承诺)。

你可以这样做:

 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

你可以做这样的事情

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