2012-04-22 91 views
1

通常情况下,异步函数(例如async(arg, cb))在末尾提供回调函数占位符(cb),以便您可以在异步例程结束时运行自己的代码。如果异步函数没有回调参数会怎么样?显然,与cb失踪:检测不提供回调的异步函数的执行结束

async(args); 
myFunction(); 

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

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

我的例子是在Google Maps Directions服务中。异步函数是一个叫做directionsDisplay.setDirections(result);的绘图例程,我想在绘图完成后重新绘制并放大。我整理了3秒钟的setTimeout,以便我想要的发生,但这是一个笨拙的解决方案。改变Google Maps API似乎是不可能的。有什么更好的?

方向服务在这里。

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

只需选择在任何下拉列表中的城市。 3秒后地图应该移动。

+0

[谷歌地图V3 setDirections()回调]的可能重复(http://stackoverflow.com/questions/7228400/google-maps-v3-setdirections-callback) – jfriend00 2012-04-22 19:04:54

回答

2

一个简单的谷歌搜索发现我这个相关的职位:Google Maps V3 setDirections() callback

这表明增加了对当方向改变事件侦听器。

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

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

+0

谢谢,我对上半年描述的一般情况(这可能是不可能的)更加好奇,但这确实解决了我眼前的问题。 – 2012-04-22 19:06:38

+0

@MiaDiLorenzo - 我在关于其他部分的回答中增加了更多内容。 – jfriend00 2012-04-22 19:18:46

+0

我很欣赏异步API的细节和评论。你是对的,我完全忽视了链接中提供的听众。 – 2012-04-22 19:23:55

1

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

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

来源:Google Maps V3 setDirections() callback

对你的问题的另一部分:不,你不能异步调用的情况下直接进行任何修改的同步代码导致它或一些hacky覆盖。

例如:
你可以试着弄清楚代码是如何异步的,也许它是一个setTimeout(func,1)调用。然后,您可以重写setTimeout函数并获取该调用,并可能为其添加回调。但这是一个相当不干净的解决方案。

+0

谢谢更新。我不得不承认我迷失在你的黑客说明中,但你暗示这不是一个很好的解决方法。 – 2012-04-22 19:22:22

2

当然,更好的解决方案 - 不要让DirectionsRenderer重新映射地图,然后再自己改变它 - 就是告诉DirectionsRenderer首先不要重新映射地图。

然后,您可以随意更新它,因为你愿意。

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

能够将它告诉preserveViewport,用于 - 那么你不需要任何凌乱的听众打扰。

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

+0

我感谢你指出,通过给你另一个10代表:) – 2012-04-23 22:02:10