如何在JavaScript中阻止异步函数

时间:2010-12-03 13:24:24

标签: javascript asynchronous

我需要在JavaScript中编写一个函数,它从调用异步函数返回一个状态。但是,调用者只接收该值,并且不提供回调函数。我试过像:

function getState() {
    var ret = null;
    asyncCall("request",
        function() { ret = "foo"; } // callback
    );
    while (ret === null)
        ; // block on the asynchronous call
    return ret;
}

然而,循环永远不会结束......

有什么想法吗?谢谢。

5 个答案:

答案 0 :(得分:9)

我认为你在寻找StratifiedJS,http://stratifiedjs.org 它允许您像编写的那样“编排”异步代码,请注意它像同步代码一样“写入”,它不会阻止您的应用程序的其余部分。 您可以通过加载apollo js库在任何地方使用它。

这是分层JavaScript中的样子:

function getState() {
  waitfor (var ret) {
    // block on the asynchronous call
    asyncCall("request", resume);
  }
  return ret;
}

当然有模块/库只会使它看起来像这样: http://onilabs.com/modules#http

function getState() {
  return http.get("request");
}

答案 1 :(得分:1)

为什么不呢:

asyncCall("request", function() {
    // here you can inspect the state
});

包装函数有什么意义?

异步函数以这种方式工作。如果要阻止执行,请使用同步调用:

var state = syncCall("request");

答案 2 :(得分:1)

最好的方法是将您想要调用的逻辑放入回调函数中。你有什么理由不能这样做吗?

您可以使用setInterval检查结果,但这也需要回调功能......

答案 3 :(得分:1)

您要做的是同步调用,因此使用专为异步调用设计的函数来做这件事并不是一个好主意。

你在这里得到答案:How can I get jQuery to perform a synchronous, rather than asynchronous, Ajax request?

答案 4 :(得分:1)

除非我误解了你的问题,否则你可以查看jQuery的ajaxStop()事件 - http://api.jquery.com/ajaxstop。这将阻塞,直到所有ajax调用完成。这显然需要通过jQuery完成所有异步调用。

$(document).ajaxStop(function() {
    // do your "ajax dependent" stuff here
});