如何在调用asynchronous调用(如Ajax)时等待代码

我正在寻找这样的东西

function someFunc() { callAjaxfunc(); //may have multiple ajax calls in this function someWait(); // some code which waits until async calls complete console.log('Pass2'); } function callAjaxfunc() { //All ajax calls called here console.log('Pass1'); } 

我试过了什么?

1 jquery.when()

尝试使用它..它工作正常。 但不是我想要的。 $.when将等待,但$.when()旁边的代码运行等待。 do callback只在ajax调用后运行

2.带有全局标志的setTimeOut()

我很有信心,这将工作。 我尝试像下面。

 GlobalFlag = false; function someFunc() callAjaxfunc(); //may have multiple ajax calls in this function setTimeOut(waitFunc, 100); // some which waits until async calls complete console.log('Pass2'); } function callAjaxfunc() { //All ajax calls called here onAjaxSuccess: function() { GlobalFlag = true; }; console.log('Pass1'); } function waitFunc() { if (!GlobalFlag) { setTimeOut(waitFunc, 100); } }​ 

仍然无法得到想要的结果。 我在这里做错了什么? 这不是这样吗?

结果我想要这样来

 Pass1 Pass2 

因为需要AJAX调用,所以不能做任何小提琴

编辑 :许多人build议callback..我知道他们..但仍然在somewait()旁边的代码将得到执行…我希望浏览器完全停止执行代码旁边的somewait()直到ajax调用..也这可能是一个不好的做法,但值得去了解和尝试,如果可能的话…

使用callback。 像这样的东西应该基于你的示例代码工作。

 function someFunc() { callAjaxfunc(function() { console.log('Pass2'); }); } function callAjaxfunc(callback) { //All ajax calls called here onAjaxSuccess: function() { callback(); }; console.log('Pass1'); } 

这将立即打印Pass1 (假设ajax请求至less需要几微秒),然后在执行Pass2时打印Pass2

为什么它不适用于使用Deferred Objects ? 除非我误解了某些东西,否则这些东西可能适用于您。

 /* AJAX success handler */ var echo = function() { console.log('Pass1'); }; var pass = function() { $.when( /* AJAX requests */ $.post("/echo/json/", { delay: 1 }, echo), $.post("/echo/json/", { delay: 2 }, echo), $.post("/echo/json/", { delay: 3 }, echo) ).then(function() { /* Run after all AJAX */ console.log('Pass2'); }); };​ 

在这里看到


UPDATE

根据你的input,似乎你最快的select是使用同步请求。 您可以在$.ajax请求中将属性async设置为false以使其阻塞。 这将挂起您的浏览器,直到请求完成。

注意我不build议这样做,我仍然认为你应该修改你的代码在基于事件的工作stream程中,而不依赖于它。

真正的程序员用信号量来做。

有一个variables设置为0 。 在每个AJAX调用之前增加它。 在每个成功处理器中减less它,然后testing0 。 如果是,你就完成了。

如果您需要等到ajax通话完成,您需要的只是同步通话。