我需要在JavaScript中编写一个函数,它从调用异步函数返回一个状态。但是,调用者只接收该值,并且不提供回调函数。我试过像:
function getState() {
var ret = null;
asyncCall("request",
function() { ret = "foo"; } // callback
);
while (ret === null)
; // block on the asynchronous call
return ret;
}
然而,循环永远不会结束......
有什么想法吗?谢谢。
答案 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
});