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

时间:2012-04-22 18:55:48

标签: javascript google-maps-api-3

通常,异步函数(比如async(arg, cb))在末尾提供回调函数占位符(cb),这样您就可以在异步例程结束时运行自己的代码。如果异步函数没有回调参数怎么办?很明显,cb遗失了:

async(args);
myFunction();

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

编辑我对上面的答案很感兴趣,但我会举例说明我是如何遇到这种情况的。

我的示例是Google Maps Directions服务。异步函数是一个名为directionsDisplay.setDirections(result);的绘图例程,我想在绘图完成后重新定位和放大。我整理了setTimeout 3秒,以便我想要的东西发生,但这是一个笨拙的解决方案。改变谷歌地图API似乎是不可能的。什么可能更好?

路线服务在这里。

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

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

3 个答案:

答案 0 :(得分:2)

一个简单的谷歌搜索找到了我这个相关的帖子:Google Maps V3 setDirections() callback

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

Javascript是单线程的,没有信号量或互斥量等同步功能。因此,在异步函数完成或将异步函数转换为同步函数之前,无法使代码“等待”。

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

答案 1 :(得分:2)

肯定是一个更好的解决方案 - 而不是让DirectionsRenderer重新定位地图,然后自己再次更改它 - 就是告诉DirectionsRenderer不要首先重新定位地图。

然后你可以随心所欲地重新定位它。

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

可以告诉它保存视频 - 然后你不需要打扰任何凌乱的听众。

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

答案 2 :(得分:1)

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

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

来源:Google Maps V3 setDirections() callback

在你的问题的另一部分:不,你不能直接同步一个异步调用,而不会修改导致它的代码或一些hacky覆盖。

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