Javascript 如何在调用Ajax等异步调用时让代码等待
我在找这样的东西Javascript 如何在调用Ajax等异步调用时让代码等待,javascript,jquery,Javascript,Jquery,我在找这样的东西 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 conso
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');
}
Pass1
Pass2
我试过什么?
1
Jquery.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);
}
}
仍然无法得到想要的结果。我做错什么了吗?不是这样吗
我想要的结果应该是这样的
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');
}
Pass1
Pass2
由于需要AJAX调用,因此无法进行任何处理
EDIT:许多人建议回调..我知道他们..但
somewait()旁边的代码仍将被执行..我希望浏览器完全停止执行somewait()旁边的代码
直到ajax调用。这可能是一种不好的做法,但如果可能,值得了解和尝试。真正的程序员使用信号量
将变量设置为0
。在每次AJAX调用之前递增它。在每个成功处理程序中递减,并测试0
。如果是,那么就完成了。使用回调。基于您的示例代码,类似的东西应该可以工作
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
。为什么它不适合您使用?除非我误解了什么,否则这可能对你有用
/* 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
请求中将属性设置为false
,使其阻塞。这将挂起您的浏览器,直到请求完成
<强>注意,我不建议这样做,我仍然认为您应该在基于事件的工作流中修复代码,而不是依赖于它。< /强>
< P>如果您需要等到Ajax调用完成,那么您需要的是同步调用。 仅供参考,支持ajax测试。您不能将someWait
之后的代码移到内部,然后
回调吗?使用ajax callUsing回调函数($。当
时)这是唯一合理的方法…我知道回调…这是最基本的方法…但在这里我想停止浏览器做任何事情…直到Ajax调用完成。@Fabriciomatté..如何添加Ajax调用???JS中的错误做法。你能解释一下为什么在我们需要使调用同步的情况下,进行同步调用是一种错误的做法吗。拜托,尤其是在AJAX的情况下,当他们试图完成时,你会冻结整个浏览器。JS在事件循环中运行。您不想阻止不相关的代码。@在某些情况下,Trevor必须停止所有操作,直到执行某个操作或达到超时,本文的原始问题是调用之间存在某种同步。我不知道这个案例的全部情况,但我知道在每一个案例中都必须重新考虑“上帝的实践”,以获得最佳结果。存在正常化,但有时进行某种去正常化是有益的。我们可以自由作出自己的决定。对不起,我的英语很差,圣诞快乐。@Trevor…正如Mario所说,我的问题是我使用的是一个框架(内部框架)…在加载时,调用应该启动,浏览器应该等到Ajax调用完成。我知道回调。这是基本的方法…但在这里我想停止浏览器做任何事情。直到Ajax调用完成。@CodeJack,我认为这在javascript中是不可能的。你到底想通过这样做来实现什么,而这是不能通过这种方式实现的?(即,将代码移动到回调中)。问题是我正在使用某个专有框架。有一个加载函数,页面开始加载,在页面加载之前,我需要获取数据,唯一可以覆盖的函数是加载函数……那么,在调用框架之前加载数据?试图使js块成为一个坏主意。从技术上讲,使用同步请求是可能的,但这是一个可怕的想法,永远不应该使用。可能存在回调不适当的情况,例如:webview.clearData({since:0},clearDataType,function(){…//重新创建新的webview})代码>将造成资源占用(chrome将创建本地存储的新副本,直到旧的副本从内部回调中释放出来,这是永远不会发生的。我尝试使用“when”…但我想要的方式是,我希望浏览器在Ajax调用完成之前停止做任何事情…基本上,这些代码是在加载期间…@CodeJack,很抱歉告诉你,但浏览器不应该这样做。)Don’不要等,你应该wait@CodeJack,如果您仍然希望在要进行阻塞的AJAX调用中将其设置为false
,那么就可以使用属性将async
设置为false
…谢谢..让我检查一下..谢谢..@CodeJack,它工作得更好吗?信号量在编程语言中可用,而不是在Ja中vaScript…信号量(如关键部分)是允许线程/进程之间安全共享资源的技术。我想你可能会对这个术语感到困惑。正如@CodeJack所说,这种对象在Javascript中不可用,但如果可以的话,它们在这种情况下就不适用了。@HMarioD:我很困惑?-特别要注意的是示例是JavaScript。@CodeJack:正如我上面的评论所提到的,信号量绝对适用于JavaScript。JavaScript没有的概念是锁,因为没有并发。信号量只是美化的计数器,通常与锁一起使用(因为在多线程环境中,您绝对需要它们)@HMarioD:可能是:)不过它结合了两个老笑话(),对我来说很有趣。