我下面有这段代码,我想在ajax调用的成功函数中返回数据。当然,如果我执行 async:false 并直接返回它,我会得到它,但我不想这样做。
如果我像现在一样运行它,信息变量是未定义的(如果我执行 async:false,它会获取信息,所以问题不是数据的内容)。
我只是不明白为什么它不起作用,我用谷歌搜索了回调函数,看来我做得对......
function PUT_updateSystem(id) {
var system= {};
system= getSystemInformation(name, function(data){
var system = data;
return system;});
var information = system.info;
}
// Returns system information
function getSystemInformation(name,callback){
$.ajax({
type:"GET",
url: getUrl(),
cache: false,
dataType: "json",
success: function(data){
callback(data);
}
});
}
编辑:将我的代码更改为我目前拥有的
我正在使用此数据生成一个 jsTree,并为该树创建 json 数据,我正在执行上述操作,但将信息变量放入一个对象并对其进行迭代以创建节点。问题不在于树,所以我不会在这里包括它。我什至可以把这个逻辑拿出来进行测试。
那么发生了什么,
- 页面开始加载
- 我执行上述
- 信息被放入一个 javascript 对象中
- 我遍历了 javascript 对象。
- 我收到错误“无法读取未定义的属性‘长度’”
- 在调试时,我看到它跳过了 system.done。这是有道理的,因为它可能不会完成。
有没有办法等待它完成?
编辑:提供更多信息
// 在一个名为 loadinfo.js 的文件中
// Returns system information promise
function getSystemInformation(){
return $.ajax({
type:"GET",
url: getUrl(), // url is defined somewhere else
cache: false,
dataType: "json"
});
}
// IN A FILE CALLED tree.js
// I have other variables from loadinfo.js that are here so they can communicate fine
$.when(getSystemInformation(), $.Deferred(function(deferred) {
$(deferred.resolve);
})).done(function(data) {
mapCache["system"] = data;
console.log("defer DONE!!");
$.each(mapCache["system"], function(index, system) {
var children = doDisplayChildNodes(system.name);
...
...
});
我在 $.each 中所做的只是从 mapCache["system"] 中获取数据并创建一个“jstree”节点。我做了一个子函数来做同样的事情,因为我有与每个系统关联的子节点。所有这些逻辑都有效,因为当我将 ajax 调用设为“async:false”时它可以正常工作——所以我不会发布它。
我在 $.each 期间收到无法读取未定义的属性“长度”。这很奇怪,因为我在 mapCache 上设置了“Watch”,并且在加载所有内容后,mapCache 填充了正确的值。我正在使用谷歌浏览器调试。