How to make code wait while calling asynchronous calls like Ajax
我在找像这样的东西
1 2 3 4 5 6 7 8 9 10 11 12 13
| 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');
} |
我试过什么?
一时,()
尝试过使用它。它工作得很好。但不是我想要的方式。$.when将等待,但$.when()旁边的代码运行时没有等待。do callback中的代码只在ajax调用后运行。
2。带有全局标志的setTimeout()。
我很有信心这会奏效。我试着跟在后面。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| 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);
}
}? |
仍然无法得到想要的结果。我在这里做错什么了吗?不是这样吗?
我想要的结果应该是这样的
由于需要Ajax调用,无法进行任何操作
编辑:很多人都在建议回调……我知道它们……但仍然会执行somewait()旁边的代码……我希望浏览器在Ajax调用之前完全停止执行somewait()旁边的代码……同样,这可能是一个糟糕的做法,但值得知道并尽可能尝试……
- fyi jsfidle.net支持Ajax测试。你不能把someWait后的代码移到.then回调的内部吗?
- 使用Ajax调用的回调函数
- 使用回调($.when是实现这一目标的唯一合理方法…
- 我知道回调……这是基本的方法……但在这里我想停止浏览器做任何事情……直到Ajax调用完成。
- @Fabr&237;Ciomat&233;…如何添加Ajax调用?……
- 因为javascript是单线程语言(不包括浏览器中的WebWorker),所以使用这种合成的等待逻辑不仅会阻止JS执行,而且还会锁定浏览器中的所有呈现。正如人们所建议的,你应该对这种行为使用承诺。省去你自己的麻烦,不要使用回调,因为它们变得更难维护和创造厄运金字塔。
使用回调。类似这样的代码应该基于示例代码工作。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| 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调用完成……
- @codejack,我认为在javascript中不可能。你到底想通过这样做来达到什么目的,而这是不可能做到的?(即将代码移动到回调中)。
- 问题是使用了一些属性框架。在页面开始加载的地方有一个加载函数,在页面加载之前我需要获取数据,我唯一能覆盖的函数是加载函数…
- 那么在调用到框架之前加载数据?尝试创建JS块是一个坏主意。从技术上讲,使用同步请求是可能的,但这是一个不应该使用的糟糕想法。developer.mozilla.org/en-us/docs/web/api/xmlhttprequest/…
- 有些情况下回调是不合适的,例如:webview.clearData({since: 0}, clearDataType, function(){ ... // recreate fresh webview });将构成资源占用(chrome将创建本地存储的新副本,等待旧存储从内部回调中释放引用,而这永远不会发生)。
- 嗨,我不理解您定义OnajaxSuccess的语法。它看起来像定义方法的语法,但它在不是构造函数的函数内部。我们在看什么?谢谢!
为什么你不使用Deferred Objects呢?除非我误解了一些事情,否则这对你可能有用。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| /* 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,使其阻塞。这将挂起您的浏览器,直到请求完成。
注意,我不建议这样做,我仍然认为您应该在基于事件的工作流中修复代码,以避免依赖它。
- 我试过使用"when",但我想让浏览器在Ajax调用完成之前停止做任何事情……基本上这段代码是在加载过程中……
- @codejack,很抱歉告诉你,但是浏览器不应该等待,你应该等待。
- @codejack,如果你还想使用它,在Ajax调用中将async设置为false,你想进行阻塞。
- 哦..有属性设置async到false…谢谢..让我检查一下..谢谢..
- @代码杰克,它工作得更好吗?
- 浏览器挂起…但我想我必须处理它…你能编辑答案吗…我会接受它…
- @密码插孔,完成。这是意料之中的,这就是为什么这是不好的做法。
- +1表示异步到假
- async to false既不受欢迎,也有问题,必须避免,除非你喜欢很多头痛。按回叫路线走
- 什么时候的问题是在Ajax完成时我不能从pass()中"返回"。如果我将"return"放入"done()"中的匿名函数中,这个返回将只退出该匿名函数。如果我将返回放在整个"when()/done()"之后——它不会等到Ajax请求完成。
- @Pilat,您的评论告诉我您不太了解如何处理异步调用。在跳入更复杂的异步/延迟构造之前,您可能需要对它进行更多的阅读和播放。
- @我相信我对异步调用有一些想法。我还不知道如何克服它。下面是小部件API,我正在尝试为其制作小部件:编写一个函数(类),它返回(公开)一组回调:render、in it、bint-au操作等。比如,我需要将数据加载到"init"中,并在"bind-au操作"中使用它。这对我来说是正确的。如何将几个小部件API回调包装为一个$.GetJSon回调?
真正的程序员用信号量来实现它。
将变量设置为0。在每次调用Ajax之前递增。在每个成功处理程序中递减,并测试0。如果是,你就完了。
- 信号量在编程语言中是可用的,而不是在javascript中…
- 信号量(如关键部分)是允许线程/进程之间安全共享资源的技术。我觉得你对这个词很困惑。正如@codejack所说,这种对象在javascript中是不可用的,但如果可以,它们就不适用于这种情况。
- @赫玛里奥德:我很困惑?en.wikipedia.org/wiki/asynchronous_信号量——特别要注意,所有示例都是在javascript中。
- @codejack:正如我上面提到的,信号量绝对适用于javascript。由于缺乏并发性,javascript没有的概念是一个锁。信号量只是美化计数器,通常与锁一起使用(因为在多线程环境中,您绝对需要它们)。
- @阿玛丹,你说得对,你不会和这个词混淆,对不起。事实上,JavaScript没有信号量,但是您可以构造类似于结构的信号量。不管怎样,我仍然认为它们在那种情况下不适用。我是C/C++程序员,主要是编程运行RTOS的嵌入式设备,并在Linux箱中与多个线程共享COMM端口和DB连接的服务进行通信,那么我对信号量的看法是非常不同的。顺便说一句,我不会投你反对票,但我认为-2与答案标题的关系比技术建议的关系更大。:)
- @赫马里奥:可能是:)它结合了两个古老的笑话,不过(一个两个),对我来说很有趣。
- 非常有趣,尤其是这两个。
- 虽然我不会这样做,+1代表跳出框框思考。这是一种令人信服的,有时甚至被遗忘的技巧。
如果您需要等待Ajax调用完成,那么您所需要的就是同步地进行调用。
- JS中的坏做法。
- 你能给我解释一下为什么同步呼叫是一个坏的做法,当我们需要的是使呼叫同步。拜托。
- 好吧,特别是在Ajax的情况下,您将在整个浏览器尝试完成时冻结它们。JS在事件循环中运行。您不想阻止不相关的代码。
- @在某些情况下,Trevor必须停止所有操作,直到执行某个操作或达到超时,此帖的原始问题表明调用之间存在某种同步。我不知道这件事的全貌,但我知道,在每一件事中,必须重新考虑"上帝的做法",才能取得最好的结果。存在规范化,但某种去规范化有时是健康的。我们可以自行决定。对不起,我的英语差,圣诞快乐。
- @Trevor…正如Mario所说的,我的问题是我正在使用一个框架(内部框架)…在这里,加载时,调用应该转到,浏览器应该等到Ajax调用完成。
- 同意不同意。:)节日快乐