因此,经过6个多小时的搜索和尝试各种解决方案,我只能在console.log(diseaseNameArray)上记录“undefined”。我是javascript的新手,无法弄清楚为什么这不记录一个填充的数组。我非常感谢您提供的任何帮助/建议。任何其他额外的代码批评也值得赞赏。
var diseaseNameArray;
var jax = $.ajax;
/*OutputHandler*/
function outputHandler(data, arrayTarget, tag, length) {
var source = $(data); /*holder of xml*/
var lengthStorage = Number(source.find(length).text()); /*length of list*/
arrayTarget = []; //array to be populated
for(i = 1; i < lengthStorage; i++)
{
arrayTarget[i] = source.find(tag + i.toString()).text();
console.log(arrayTarget[i]); //to check that elements are being entered
}
console.log(arrayTarget); //succesfully logs the full array
}
/*General function*/
function populateArray(xmlLocation, typeOfData, tag, lengthStorage, extFunction, targetArray) {
$.ajax({
type: "GET",
url: xmlLocation,
dataType: typeOfData,
success: function(xml)
{
extFunction(xml, targetArray, tag, lengthStorage);
},
error: function()
{
console.log("ugh");
}
});
}
populateArray("malePatient.xml", "xml", "sub", "length", outputHandler, diseaseNameArray);
console.log(diseaseNameArray);
更新 感谢Jan的观点,我回到了绘图板上,让它发挥作用。如果有人有任何建议我会非常感激!
答案 0 :(得分:4)
Ajax是异步的。在ajax请求完成之前,您正在调用populateArray
,然后立即将diseaseNameArray
记录到控制台,所以当然它将是未定义的 - 您&#39 ;不给ajax请求时间完成。您需要在success
中登录到控制台。
或者使ajax调用与async: false
同步。
答案 1 :(得分:2)
AJAX代表 A 同步 J avascript A nd X ml。由于它是异步的,因此您的数据不一定会达到outputHandler
功能。您应该创建一个在outputHandler
之后运行的函数,并在outputHandler
结束时调用。您应该将console.log
放在第二个函数中。这样,它可以保证获取数据。
或者,您可以将async: false
传递给AJAX调用以使其同步,以便在outputHandler
之后发生console.log。但是,如果AJAX调用失败,那么仍然会调用console.log,并且它将是未定义的。
答案 2 :(得分:0)
使用这个问题的answer我能够创建一个能够访问大量xml文档并利用所收集数据的游戏功能。