在循环的每次迭代中等待async .done()

Wait for async .done() in every iteration of loop

本文关键字:async 等待 done 迭代 循环      更新时间:2023-09-26

我有这样一个锁住的函数:

function getMainData() {
    var dfd = $.Deferred();
    $.getJSON('My string that i pass',
        function(result) {
            if (result !== undefined) {
                dfd.resolve(result);
            }
        })
    return dfd.promise()
}
function getSpecificData() {
    var dfd = $.Deferred();
    var myArray = [];
    for (var i = 0; i < 5; i++) {
        getMainData().done(function(result) {
            myArray.push(result)
            dfd.resolve(myArray) //This is where I am lost.
        })
    }
    return dfd.promise()
}
getSpecificData().done(function(result) {
    console.log(result);
})

我想我知道承诺是如何工作的,如果你把它们链接在一起,但是我不能让for循环等待异步调用在下一次迭代之前完成。

有人能帮帮我吗?

for循环没有办法延迟下一次迭代以等待异步代码。

可以通过使用递归调用的函数来解决

function getMainData() {
    return $.getJSON('My string that i pass');
}
function getSpecificData() {
    var myArray = [], def = new $.Deferred();
    (function rec(i) {
        getMainData().done(function(result) {
            myArray.push(result);
            if (i < 5 && result !== undefined) {
                console.log(i)
                rec(++i);
            } else {
                def.resolve(myArray);
            }
        });
    })(0);
    return def.promise();
}
getSpecificData().done(function(result) {
    console.log(result);
});

你应该把所有的承诺都放到一个数组中,然后等待它们全部完成。

function getMainData() {
    return $.getJSON('My string that i pass');
}
function getSpecificData() {
    var promiseArray = [];
    for (var i = 0; i < 5; i++) {
        promiseArray.push(getMainData());
    }
    return $.when.apply($, promiseArray);
}
getSpecificData().done(function(result) {
    console.log(result);
})

您是否尝试过不使用promise:

var myArray = [];
var cpt=0;
var total=5;
getMainData();
console.log(myArray);
function getMainData() 
{
    $.getJSON('My string that i pass', function(result) {
        if(cpt<total)
        {
            myArray.push(result);
            cpt++;
            getMainData();
        }
    })
}