[英]What's the most efficient way to call a Node.js backend function with JavaScript
[英]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 });
通用答案:
异步中只有两种方法可用。 编程:事件和回调。 期。
(从技术上讲,两者在最低级别上并没有真正的区别,“事件”只是一个(库)函数-执行事件“触发”的那个函数-执行所有注册为侦听器的功能,因此与回调-从技术上讲,即,当您编写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.