什么';在Javascript中,等待异步函数调用的最有效方法是什么?

什么';在Javascript中,等待异步函数调用的最有效方法是什么?,javascript,Javascript,这可能是相反的,但无论如何,我也需要知道它的答案 我的算法中有一个Ajax调用,我需要等待它运行一些代码。有两种解决方案: 1) 典型的解决方案是: ajaxCall(function(result){ //the code to run after the call is returned }); 2) 我想知道它是否可以作为一个替代方案: res=null; ajaxCall(function(result){ res=result; }); while(res==null)/*w

这可能是相反的,但无论如何,我也需要知道它的答案

我的算法中有一个Ajax调用,我需要等待它运行一些代码。有两种解决方案:

1) 典型的解决方案是:

ajaxCall(function(result){
  //the code to run after the call is returned
});
2) 我想知道它是否可以作为一个替代方案:

res=null;
ajaxCall(function(result){
  res=result;
});
while(res==null)/*wait! but this will lock the GUI I guess*/;
//do the rest of the code because now res is initialized

问题是如何以一种高效的方式编写第二个解决方案,而不冻结GUI?

我建议挂接所有相关代码,作为ajax调用返回的回调执行。这样,所有其他javascript都可以继续执行,并且在调用期间不会使浏览器无响应

或者,这不是我永远不会做的事情,您可以使用
async:false
使ajax调用同步,如下所示:

$.ajax({ url: ..., async: false });

我建议将所有依赖代码挂接起来,作为ajax调用返回的回调执行。这样,所有其他javascript都可以继续执行,并且在调用期间不会使浏览器无响应

或者,这不是我永远不会做的事情,您可以使用
async:false
使ajax调用同步,如下所示:

$.ajax({ url: ..., async: false });

有很多方法可以做到这一点。其中一个方法是将回调传递给ajax(或者至少是它的引用)。你的代码#1就是一个例子


另一个是您有一个通知程序对象,您可以将ajax成功调用添加到该对象中。然后,您可以将其他功能(一个或多个)插入其中,以收听“成功”公告

有很多方法可以做到这一点。其中一个方法是将回调传递给ajax(或者至少是它的引用)。你的代码#1就是一个例子

另一个是您有一个通知程序对象,您可以将ajax成功调用添加到该对象中。然后,您可以将其他功能(一个或多个)插入其中,以收听“成功”公告

一般答案:

异步中只有两种方法可用。编程:事件和回调。句号

(从技术上讲,这两者在最低级别上并没有什么区别,“事件”只是一个(库)函数——执行事件“触发”的函数——执行注册为侦听器的所有函数,因此它与回调函数相同——从技术上讲,即在编写event.fire()时)或者,不管首选库的事件语法是什么,它都是所有已注册事件处理程序函数的同步调用)。设计API时,何时使用一种或另一种取决于偏好、惯例和风格。)

一般答案:

异步中只有两种方法可用。编程:事件和回调。句号


(从技术上讲,这两者在最低级别上并没有什么区别,“事件”只是一个(库)函数——执行事件“触发”的函数——执行注册为侦听器的所有函数,因此它与回调函数相同——从技术上讲,即在编写event.fire()时)或者,不管首选库的事件语法是什么,它都是所有已注册事件处理程序函数的同步调用)。设计API时,何时使用其中一种是一个偏好、惯例和风格的问题。)

Javascript编程,特别是AJAX,从定义上讲是异步的。因此,如果你有一个需要“等待”的算法,你最好重新考虑这个算法。具有讽刺意味的是,Javascript语法并不最适合异步编程,但有许多库可以帮助您控制回调并避免意大利面代码

意大利面条回调示例:

function ajaxRequest(url1, function() {
    animateSomething(div, function() {
        ajaxRequest(url2, function() {
            ....
        })
    })
})
同样的,看起来更干净:

async.series([
    function(_) { ajaxRequest(url1, _) },
    function(_) { animateSomething(div, _) },
    function(_) { ajaxRequest(url2, _) }
])

Javascript编程,特别是AJAX,从定义上讲是异步的。因此,如果你有一个需要“等待”的算法,你最好重新考虑这个算法。具有讽刺意味的是,Javascript语法并不最适合异步编程,但有许多库可以帮助您控制回调并避免意大利面代码

意大利面条回调示例:

function ajaxRequest(url1, function() {
    animateSomething(div, function() {
        ajaxRequest(url2, function() {
            ....
        })
    })
})
同样的,看起来更干净:

async.series([
    function(_) { ajaxRequest(url1, _) },
    function(_) { animateSomething(div, _) },
    function(_) { ajaxRequest(url2, _) }
])

只需使ajax调用同步即可

参考:


查找异步参数

,只需使ajax调用同步即可

参考:


查找async参数

只需使ajax调用同步即可。ref:查找异步参数。同步请求仍然锁定GUI。@当然,这就是异步和同步的全部要点。但是它仍然比可能的无限循环要好。@Yoshi:但是他要求一种不锁定GUI的方法。建议他使请求同步与该要求冲突,最好的建议仍然是重新编写代码,使其能够完全异步运行。@AndyE是的,好的,可能是这样。我可能只是因为看到while循环而窒息了只需使ajax调用同步即可。ref:查找异步参数。同步请求仍然锁定GUI。@当然,这就是异步和同步的全部要点。但是它仍然比可能的无限循环要好。@Yoshi:但是他要求一种不锁定GUI的方法。建议他使请求同步与该要求冲突,最好的建议仍然是重新编写代码,使其能够完全异步运行。@AndyE是的,好的,可能是这样。我可能只是因为看到while循环而窒息了此解决方案使用JQuery,这是可以接受的。但是,Yoshi的答案被标记为最终答案,因为它使用纯Javascript。然而,Yoshi的答案被标记为最终答案,因为它使用纯Javascript。不,没有线程!请。阅读“事件循环”(google):-)有趣,所以整个Javascript代码在一个线程中运行,这就是为什么Javascript代码本质上是“线程安全”的?是的。有关如何在JS中实现并行性的计划,请参见“workers”(一些JS实现已经阅读)