【问题标题】:How to make setTimeout behave like a wait如何使 setTimeout 表现得像等待
【发布时间】: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 解决了这个问题,因为浏览器可以阻塞和解除阻塞线程(就像它对 alertconfirm 对话框所做的那样),但你应该避免这种情况,因为它会阻塞所有内容,包括事件、css 动画、dom 渲染、gif动画等。它使您的网站被锁定并阻止用户与之交互。

标签: javascript jquery settimeout wait


【解决方案1】:

重申一下,通常你不想尝试将 asynch js 变成 sych。

但是,如果必须,您可以通过将 ajax 调用完成后要执行的内容放入一个大函数中来完成您想做的事情,并在 Ajax 函数的成功回调中调用该函数。无需为此弄乱 settimeout/recursive 的东西。

即:

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

【讨论】:

  • 我会遵循这个方法!尽管从概念上讲,将所有内容都放在 ajax 成功回调中是没有意义的,因为 ajax 调用只是表单字段的其他验证中的一个验证(它验证某个域是否存在)...
【解决方案2】:

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

查看jquery docs 中的 jqXHRObject,这使得成功和错误方法的行为类似于 Promise,因此您可以在 ajax 查询完全执行且不会阻塞 UI 线程时对响应执行操作。

【讨论】:

    【解决方案3】:

    你可以使用 setInterval

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

    但是伙计,这显然不是正确的做法。如果您有时间,请阅读promises,也许会对您有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-01
      • 2017-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-31
      • 2021-11-12
      相关资源
      最近更新 更多