【发布时间】:2015-09-28 20:14:54
【问题描述】:
我有一个 javascript 代码,在某个时刻,我想暂停执行,直到 ajax 通信完成后再继续。
我有以下
var set_ajax_done = function(){
ajax_done = true;
}
// Ajax part
ajax_done = false;
$.ajax({
url: $url,
type: 'GET',
success: function (result) {
// some treatment
set_ajax_done();
}
});
// Make sure the ajax communication and treatment are done before continuing
make_sure_aj_comm_finished();
var make_sure_aj_comm_finished = function(){
if ( ajax_done == false )
{
setTimeout(function(){
make_sure_aj_comm_finished();
}, 500);
}
}
当我执行这段代码时,似乎执行只是通过并且不等待布尔变量 ajax_done 为 true。
我怎样才能使代码执行make_sure_aj_comm_finishedrecursively 直到变量ajax_done 是true
谢谢!
【问题讨论】:
-
等待很糟糕。相反,只需将您希望在 ajax 调用之后发生的事情放入成功函数中。
-
可能会有所帮助:stackoverflow.com/questions/20209097/… 这是一本好书。但是,正如@JonathanM 上面所说,您不应该这样做,因为它可以冻结整个页面。
-
Promises 是你的朋友。拥抱他们:)) -
在 javascript 中,
wait是不可能的,因为它是单线程的;没有其他线程可以解锁该线程。如果您锁定线程,则无法运行可以解锁它的逻辑。同步 ajax 解决了这个问题,因为浏览器可以阻塞和解除阻塞线程(就像它对alert和confirm对话框所做的那样),但你应该避免这种情况,因为它会阻塞所有内容,包括事件、css 动画、dom 渲染、gif动画等。它使您的网站被锁定并阻止用户与之交互。
标签: javascript jquery settimeout wait