Env*_*vin 1 ajax jquery callback
我在下面有这个代码,我想在ajax调用的success函数中返回数据.当然,如果我做async:false并直接返回它我得到它但我不想那样做.
如果我像现在一样运行它,信息变量是未定义的(如果我执行异步: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);
}
});
}
Run Code Online (Sandbox Code Playgroud)
编辑:将我的代码更改为我目前的代码
我正在使用这些数据生成一个jsTree,并为该树创建json数据,我正在执行上述操作,但是将信息变量放入一个对象中并迭代它以创建节点.问题不在于树,所以我不会在这里包含它.我甚至可以把这个逻辑用于测试.
那么发生了什么,
有没有办法等待它完成?
编辑:提供更多信息
//在一个文件调用的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);
...
...
});
Run Code Online (Sandbox Code Playgroud)
我在这个$ .each中所做的只是从mapCache ["system"]中获取数据并创建一个"jstree"节点.我做一个子函数来做同样的事情,因为我有与每个系统相关的子节点.所有这些逻辑都有效,因为当我将ajax调用称为"async:false"时它工作正常 - 所以我不会发布它.
我收到了$ .each期间无法读取未定义的属性"长度".这很奇怪,因为我在mapCache上设置了"Watch",并且在加载完所有内容后,mapCache将填充正确的值.我正在使用Google Chrome调试.
您使用了回调,但仍然使用同步逻辑而不是异步.尝试这样做:
function PUT_updateSystem(id) {
var system = getSystemInformation(name);
system.done(function(data){
var information = data.info;
// do stuff with `information` here, not elsewhere.
});
}
// Returns system information promise
function getSystemInformation(name){
return $.ajax({
type:"GET",
url: getUrl(),
cache: false,
dataType: "json"
});
}
Run Code Online (Sandbox Code Playgroud)