如何在调用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通话完成,您需要的只是同步通话。