任务:使用$ .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()之前触发?
答案 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
});