繁体   English   中英

等待Java中异步函数调用的最有效方法是什么?

[英]What's the most efficient way to wait for an asynchronous function call in 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)/*wait! but this will lock the GUI I guess*/;
//do the rest of the code because now res is initialized

问题是我该如何以不冻结GUI的有效方式编写第二个解决方案?

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

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

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

只需使ajax调用同步即可。

参考: http : //developer.mozilla.org/en/XMLHttpRequest

寻找异步参数

通用答案:

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

(从技术上讲,两者在最低级别上并没有真正的区别,“事件”只是一个(库)函数-执行事件“触发”的那个函数-执行所有注册为侦听器的功能,因此与回调-从技术上讲,即,当您编写event.fire()或首选库的任何事件语法时,它都是对所有已注册事件处理程序函数的同步调用)。 在设计API时,何时使用哪种取决于偏好,约定和样式。)

Java编程,尤其是AJAX,在定义上是异步的。 因此,如果您有一种算法需要“等待”某些东西,那么最好重新考虑该算法。 具有讽刺意味的是,Javascript语法并非最适合异步编程,但是有许多库可帮助您控制回调并避免使用意大利面条式代码。

意大利面条回调的示例:

function ajaxRequest(url1, function() {
    animateSomething(div, function() {
        ajaxRequest(url2, function() {
            ....
        })
    })
})

async.js相同看起来更干净:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM