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

时间:2016-11-10 11:37:57

标签: javascript jquery typescript es6-promise

所以,我有这样的锁定功能:

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

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

有人可以帮帮我吗?

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

您应该将所有承诺推送到数组中并等待所有承诺完成。

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

答案 2 :(得分:0)

您是否尝试过不使用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();
        }
    })
}

希望这有帮助。