AJAX + jQuery Deferred:执行顺序

时间:2014-07-27 21:55:14

标签: ajax jquery-deferred

任务:使用$ .post从服务器获取数据,通过方法.success()处理它们,之后调用一些函数。

    var t;
    $.when($.post("get_json.php", function(res) {
      t = res;
    }, 'json')).done(function() {
      console.log(t);
    });

我是否正确理解延迟方法.done()是在.success完成后执行的(即t = res)? 但为什么“console.log(t)”显示“未定义”? 是.done()在请求之后但在.success()之前触发?

2 个答案:

答案 0 :(得分:0)

传递成功"回调$.post().done(...)的(首选)链接的替代方法。做一个或另一个,而不是两个,那么你不必担心执行顺序。

此外,除非您对异步数据有一个不错的缓存策略,否则您不应将t设置为外部变量。

$.post("get_json.php", ...).done(function(t) {
    console.log(t);
    //do awesome things with t here
});

缓存将是这样的:

var asyncCache = {};

...

function get_t() {
    return (asyncCache.t) ? $.when(asyncCache.t) : $.post("get_json.php", ...).done(function(t)  {
        asyncCache.t = t;
    });
}

...

get_t().done(function(t) {
    console.log(t);
    //do awesome things with t here
}

答案 1 :(得分:0)

当您有多个承诺并且想要等待所有承诺完成时,仅需要

$.when()。你根本不需要它来进行单个ajax调用。你可以这样做:

$.post("get_json.php").done(function(t) {
    // use the results of the ajax call here
    console.log(t);
});

此外,您的代码示例使用了成功回调函数和.done()处理程序。选择其中一个,而不是两个,因为它们是在完成ajax调用时获得回调的不同方式。我建议上面的承诺实施,因为它更灵活。但是,您也可以只使用成功处理程序:

$.post("get_json.php", function(t) {
    // use the results of the ajax call here
    console.log(t);
}, 'json');

注意,当你有这样的异步操作时,你需要在成功回调(或promise回调)中使用ajax调用的结果,或者从那里调用一些函数并将数据传递给它。您不希望将数据放入全局变量或更高范围的变量中,因为其他代码根本无法知道数据何时就绪以及何时不准备。将您的操作放入回调中。


如果你想要等待多个ajax调用,那么你可以这样做:

$.when($.post("get_json.php"), $.post("get_json2.php")).done(function(r1, r2) {
    // use the results of the ajax call here
    console.log(r1[0]);    // results from first ajax call
    console.log(r2[0]);    // results from second ajax call
});