吊装或回叫问题?在writeLog()之前完成(循环)但在完成

时间:2016-10-03 23:45:49

标签: javascript arrays object callback hoisting

我正在尝试通过一系列团队来获取玩家数据并将数据传递给对象。我的ajax调用获取文件。在通过所有团队循环之后,我想要写一个包含所收集数据的日志。问题是writeLog()被立即调用 - 我认为 - 不等待循环完成。这是一个悬挂问题吗?回调问题?在for循环结束后,如何将代码重构为writeLog()?

(function(){

$('#generate-report').on('click', function(){

    var logObj = {
        playerCount: 0,
        firstNameArray: [],
        lastNameArray: [],
        firstNameCharCount: 0,
        lastNameCharCount: 0,
        resultFirst: 0,
        resultLast: 0,
        freqReportFirst: "First name\n",
        freqReportLast: "Last name\n",
        freqObjFirst: {},
        freqObjLast: {},        
    }

    var url = "http://feeds.nfl.com/feeds-rs/roster/";

    var teams = new Array("3800", "0200", "0325", "0610", "0750", "0810", "0920", "1050",
                          "1200", "1400", "1540", "1800", "2120", "2200", "2250", "2310",
                          "2700", "3000", "3200", "3300", "3410", "3430", "2520", "3700",
                          "3900", "4400", "4600", "4500", "2510", "4900", "2100", "5110"
                                      );
    //var teams = new Array("3800");  // For testing

    for(var i=0; i<teams.length; i++){
        console.log(teams[i]);
        $.ajax({
            url: url + teams[i] + ".json",
            type: 'GET',
            success: function(response){
                processPlayerNames(response, logObj);
            },
            error: function(response){
                console.log(response);
            }
        });
    };   

    writeLog(logObj);

});

})();

1 个答案:

答案 0 :(得分:1)

$.ajax()异步返回结果。您可以将$.ajax()调用数组,然后在数组承诺对象上使用Promise.all().map(),或使用$.when()Function.prototype.apply(),{{1}在.map()处调用writeLog()链接到表示从.then()调用返回的jQuery promise对象的变量之前执行所有异步任务。

$.when()