简单的答案是关闭async
。但这是错误的做法。正确的答案是重新思考如何编写其余代码。
而不是这样写:
function functABC(){
$.ajax({
url: 'myPage.php',
data: {id: id},
success: function(data) {
return data;
}
});
}
function foo () {
var response = functABC();
some_result = bar(response);
// and other stuff and
return some_result;
}
你应该这样写:
function functABC(callback){
$.ajax({
url: 'myPage.php',
data: {id: id},
success: callback
});
}
function foo (callback) {
functABC(function(data){
var response = data;
some_result = bar(response);
// and other stuff and
callback(some_result);
})
}
也就是说,不是返回结果,而是将需要完成的代码作为回调传入。正如我所展示的,回调可以嵌套到与函数调用一样多的级别。
快速解释为什么我说关闭异步是错误的:
关闭异步将在等待 ajax 调用时冻结浏览器。用户不能点击任何东西,不能滚动,在最坏的情况下,如果用户内存不足,有时当用户将窗口拖出屏幕并再次拖入时,他会看到空白区域,因为浏览器被冻结并且无法重绘。对于像 IE7 这样的单线程浏览器,情况更糟:所有网站都冻结了!遇到这种情况的用户可能会认为您的网站有问题。如果您真的不想异步执行,那么只需在后端进行处理并刷新整个页面。它至少不会让人觉得有问题。