【发布时间】:2013-02-06 15:03:07
【问题描述】:
我下面有这段代码,我想在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 填充了正确的值。我正在使用谷歌浏览器调试。
【问题讨论】:
-
你怎么知道你的回调“不起作用”?对我来说它有效,但没有什么特别之处。
-
这是什么功能! ? getUrl() 是做什么的,它带你到什么 url,在那个 url 上的代码是什么?
-
函数在调用中定义。它返回检索到的数据。 getUrl() 与问题无关,是从代码中抽象出来的——它只是用于此请求的 url。 PUT_updateSystem 在我的实际实现中继续进行,但正是这部分我提出了我需要帮助的问题。
-
#5 发生在哪里?
-
当我加载页面时,我正在运行这个函数并将值放入 javascript 对象中,然后我正在呈现 HTML。当我渲染 html 以显示我正在制作的树时,我需要遍历我返回的值(现在位于 javascript 对象中),然后我得到这个错误。