如何使setTimeout表现得像一个等待

时间:2015-09-28 20:14:55

标签: javascript jquery settimeout wait

我有一个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为真。

如何使代码以递归方式执行make_sure_aj_comm_finished,直到变量ajax_done为true

谢谢!

3 个答案:

答案 0 :(得分:1)

重申一下,通常你想偏离试图将asynch js变成sych。

但是如果必须的话,你可以通过将ajax调用完成后想要执行的内容放到一个大函数中来完成你想要做的事情,并在Ajax函数的成功回调中调用该函数。不需要乱用settimeout /递归的东西。

即:

$.ajax({
  url: $url,
  type: 'GET',
  success: function (result) {
    // some treatment
    everything_after_ajax();
  }
});

答案 1 :(得分:0)

您应该避免尝试执行同步操作,因为这会阻止浏览器的UI线程使浏览器无响应。这就是提供成功和错误方法的原因,以便您可以执行异步操作。

查看jquery docs中的jqXHRObject,这使得成功和错误方法就像promises一样,因此当ajax查询完全执行并且不阻止UI线程时,您可以对响应执行操作。

答案 2 :(得分:0)

您可以使用setInterval

var make_sure_aj_comm_finished = setInterval(function(){
    if(ajax_done == true){
        clearInterval(make_sure_aj_comm_finished);
    }
}, 500);

但是男人,那清楚不是正确的方法。如果你有时间,请阅读promises,也许它会对你有帮助。