我在找这样的东西
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调用,所以不能做任何小动作
编辑:很多人都建议回调。。。我知道。。。但是someWait()
旁边的代码仍然会被执行。。。我希望浏览器完全停止执行someWait()
旁边的代码,直到ajax调用。。。而且这可能是一个不好的实践,但是如果可能的话值得了解和尝试。。。
使用回调。根据您的示例代码,类似的东西应该可以工作。
function someFunc() {
callAjaxfunc(function() {
console.log('Pass2');
});
}
function callAjaxfunc(callback) {
//All ajax calls called here
onAjaxSuccess: function() {
callback();
};
console.log('Pass1');
}
这将立即打印pass1
(假设ajax请求至少需要几微秒),然后在执行onAjaxSuccess
时打印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');
});
};
看这里。
根据您的输入,您最快的选择似乎是使用同步请求。您可以在$.ajax
请求中将属性async
设置为false
,以阻止它们。这将挂起您的浏览器,直到请求完成。
请注意,我不建议这样做,我仍然认为您应该在基于事件的工作流中修复您的代码,使其不依赖于它。
真正的程序员用信号量来做这件事。
将变量设置为0
。在每次AJAX调用之前递增它。在每个成功处理程序中递减它,并测试0
。如果是的话,你就完蛋了。