AJAX异步调用 - 无法使用回调返回数据?

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数据,我正在执行上述操作,但是将信息变量放入一个对象中并迭代它以创建节点.问题不在于树,所以我不会在这里包含它.我甚至可以把这个逻辑用于测试.

那么发生了什么,

  1. 页面开始加载
  2. 我执行上述操作
  3. 信息被放入javascript对象中
  4. 我遍历javascript对象.
  5. 我收到错误"无法读取未定义的属性'长度'
  6. 在我调试时,我发现它跳过了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);
            ...
                    ...
});
Run Code Online (Sandbox Code Playgroud)

我在这个$ .each中所做的只是从mapCache ["system"]中获取数据并创建一个"jstree"节点.我做一个子函数来做同样的事情,因为我有与每个系统相关的子节点.所有这些逻辑都有效,因为当我将ajax调用称为"async:false"时它工作正常 - 所以我不会发布它.

我收到了$ .each期间无法读取未定义的属性"长度".这很奇怪,因为我在mapCache上设置了"Watch",并且在加载完所有内容后,mapCache将填充正确的值.我正在使用Google Chrome调试.

use*_*654 5

您使用了回调,但仍然使用同步逻辑而不是异步.尝试这样做:

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)