通常,异步函数(比如async(arg, cb)
)在末尾提供回调函数占位符(cb
),这样您就可以在异步例程结束时运行自己的代码。如果异步函数没有回调参数怎么办?很明显,cb
遗失了:
async(args);
myFunction();
myFunction()
将首先运行。如何在myFunction()
结束后才能async
运行?我尝试编写自己的回调包装器但没有成功;它们只是重定向函数调用。
编辑我对上面的答案很感兴趣,但我会举例说明我是如何遇到这种情况的。
我的示例是Google Maps Directions服务。异步函数是一个名为directionsDisplay.setDirections(result);
的绘图例程,我想在绘图完成后重新定位和放大。我整理了setTimeout
3秒,以便我想要的东西发生,但这是一个笨拙的解决方案。改变谷歌地图API似乎是不可能的。什么可能更好?
路线服务在这里。
只需在下拉列表中选择一个城市即可。 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
可以告诉它保存视频 - 然后你不需要打扰任何凌乱的听众。
答案 2 :(得分:1)
这应该为您提供回调/事件:
google.maps.event.addListener(directionsDisplay, 'directions_changed', function() {
// ... CALLBACK
});
来源:Google Maps V3 setDirections() callback
在你的问题的另一部分:不,你不能直接同步一个异步调用,而不会修改导致它的代码或一些hacky覆盖。
例如:
您可以尝试弄清楚代码是如何异步的,也许是一个setTimeout(func,1)调用。然后,您可以覆盖setTimeout函数并获取调用,可能会向其添加回调。但那是一个非常不干净的解决方案。