繁体   English   中英

检测不提供回调的异步函数的执行结束

[英]Detecting the end of execution of an asynchronous function that provides no callback

通常,异步函数async(arg, cb)例如async(arg, cb) )在末尾提供了回调函数占位符( cb ),因此您可以在异步例程结束时运行自己的代码。 如果异步函数没有回调参数怎么办? 显然cb在以下位置丢失:

async(args);
myFunction();

myFunction()将首先运行。 如何使myFunction()仅在async结束后运行? 我尝试编写自己的回调包装程序没有成功; 他们只是重定向函数调用。

编辑我对以上回答很感兴趣,但我将举一个例子说明我如何遇到这种情况。

我的示例在Google Maps Directions服务中。 异步函数是一个名为directionsDisplay.setDirections(result);的绘制例程directionsDisplay.setDirections(result); ,我想在绘图完成后更新和放大。 我将setTimeout为3秒,以便实现所需的操作,但这是一个笨拙的解决方案。 更改Google Maps API似乎是不可能的。 还有什么比这更好呢?

指示服务在这里。

http://jsfiddle.net/ryxtj/1/

只需在任一下拉列表中选择一个城市。 3秒后,地图应移动。

一个简单的Google搜索找到了以下相关帖子: Google Maps V3 setDirections()回调

该图显示了在方向更改时添加事件侦听器。

Javascript是单线程的,不具有信号灯或互斥锁之类的同步功能。 因此,无法使代码“等待”,直到异步功能完成或将异步功能转换为同步功能为止。

解决此问题的唯一方法是使用事件处理程序和/或回调函数。 没有任何自尊的API提供者会为您提供异步功能的API,而没有某种能力知道它何时完成。 如果确实如此,那将是一个非常糟糕的API,您必须进入该API的源实现,找到处理事件完成的位置并安装回调(通过修改原始源)。 除非在设计中已经为完成事件或完成回调提供了它们,否则您无法从代码“外部”进行其他操作。

当然,更好的解决方案-而不是让DirectionsRenderer更新地图,然后jsut自己再次更改地图-是要让DirectionsRenderer首先不要更新地图。

然后,您可以随意更新它。

请参阅https://developers.google.com/maps/documentation/javascript/reference#DirectionsRendererOptions

可以告诉它保存起来-然后,您无需打扰任何杂乱的监听器。

像这样: http : //jsfiddle.net/8kbf2/1/

这应该为您提供回调/事件:

google.maps.event.addListener(directionsDisplay, 'directions_changed', function() {
  // ... CALLBACK
});

来源: Google Maps V3 setDirections()回调

关于您问题的另一方面:不,您不能直接同步异步调用,而无需对导致它的代码进行任何修改或进行一些恶意覆盖。

例如:
您可以尝试弄清楚代码是如何异步进行的,也许是setTimeout(func,1)调用。 然后,您可以覆盖setTimeout函数并获取调用,并可能向其添加回调。 但这是一个非常不干净的解决方案。

暂无
暂无

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

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