我有几个函数使用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文件。但是,我所做的就是将同步问题转移到另一个函数。仍然有一点我的程序的同步部分需要来自异步函数的数组。
我该怎么办?
答案 0 :(得分:1)
已编辑以添加代码
问题是在这一行,赋值发生在函数完成之前,因此“未定义”结果
var stuff = getBalanceXML(getBalanceBarChart);
如果我理解你的需要,这应该让你解决:
将内容设为全局可访问的变量
在 getBalanceBarChart 中,不要返回该值,而是直接将其分配给 stuff
(可选)您仍然可以在 getBalanceBarChart 函数中触发您可能想要执行的其他操作。
基本上,通过同时执行结果分配和下一步操作的触发,在回调功能结束时,您可以保证异步部分已完成。
希望有所帮助。
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");
});