我正在尝试使用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
})
}
}
答案 0 :(得分:7)
Promise.all([ promise1, promise2 ])
(Promise.all() on MDN)。它返回一个新的promise,一旦所有传递的promises得到解决,它就会得到解决。但要注意 - 当至少一个承诺被拒绝时,它会立即被拒绝(它不会等待任何其他承诺)。
答案 1 :(得分:4)
您可以执行以下操作;
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;
答案 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
}
答案 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)
})
}
}