JavaScript / jQuery AJAX - 将我的异步数据恢复到我的同步程序中

时间:2014-09-26 12:33:08

标签: javascript jquery ajax

我有几个函数使用jQuery AJAX调用从我的服务器检索XML文件,并将其转换为可用的东西。请查看以下代码:

getBalanceXML: function (callback) {
    $.ajax({
        type: 'GET',
        url: 'Content/saldotracking.xml', 
        dataType: 'xml',
        success: callback,
        error: function () { throw new Exception("getBalanceXML(): Failed to load XML file"); }
    })
},

getBalanceBarChart: function (xml) {
    var balanceArray = [];
    $(xml).find('Balance').each(function () {
        var nodeObject = {
            //fill a JavaScript object with values from the XML file in the format I need
            }
        balanceArray.push(nodeObject);

    });
    console.log(balanceArray);
    return balanceArray;
}

现在,当我用:

调用此函数时
var stuff = getBalanceXML(getBalanceBarChart);
alert(typeof(stuff));

东西 var仍未定义。在StackOverflow上的其他答案之后,我将 getBalanceChart 函数作为参数传递给 getBalanceXML 函数,该函数执行AJAX调用。成功!现在getBalanceChart也可以使用从AJAX调用中获得的XML文件。但是,我所做的就是将同步问题转移到另一个函数。仍然有一点我的程序的同步部分需要来自异步函数的数组。

我该怎么办?

2 个答案:

答案 0 :(得分:1)

已编辑以添加代码

问题是在这一行,赋值发生在函数完成之前,因此“未定义”结果

var stuff = getBalanceXML(getBalanceBarChart);

如果我理解你的需要,这应该让你解决:

  1. 内容设为全局可访问的变量

  2. getBalanceBarChart 中,不要返回该值,而是直接将其分配给 stuff

  3. (可选)您仍然可以在 getBalanceBarChart 函数中触发您可能想要执行的其他操作。

  4. 基本上,通过同时执行结果分配和下一步操作的触发,在回调功能结束时,您可以保证异步部分已完成。

    希望有所帮助。

    getBalanceBarChart: function (xml) {
    var balanceArray = [];
    $(xml).find('Balance').each(function () {
        var nodeObject = {
            //fill a JavaScript object with values from the XML file in the format I need
            }
        balanceArray.push(nodeObject);
    
    });
    console.log(balanceArray);
    
    // DO not return value, instead assign it to a variable directly,
    // since this will only occur after any asynchronous processing
    
    myGlobalVariable = balanceArray;
    
    // optional : someOtherFunction();
    }
    

答案 1 :(得分:0)

正在发生的事情是,您要为stuff分配从getBalanceXML返回的值,这不是任何内容,或undefined。 AJAX调用是非阻塞的,因此getBalanceXML会激活AJAX并立即退出函数。

我会做这样的事情:

$.ajax({
    type: 'GET',
    url: 'Content/saldotracking.xml', 
    dataType: 'xml'        
}).done(function(xml) {
    var balanceArray = [];
    $(xml).find('Balance').each(function () {
        var nodeObject = {
            //fill a JavaScript object with values from the XML file in the format I need
        }
        balanceArray.push(nodeObject);
    });
    console.log(balanceArray);

    // Do something with balanceArray
    // ex. updateBalance(balanaceArray);

}).fail(function() {
    throw new Exception("getBalanceXML(): Failed to load XML file");
});