1

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

async(args);
myFunction();

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

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

我的示例是在 Google Maps Directions 服务中。异步函数是一个名为 的绘图例程directionsDisplay.setDirections(result);,我想在绘图完成后居中并放大。我把setTimeout3 秒的时间放在一起,这样我想要的事情就会发生,但这是一个笨拙的解决方案。更改 Google Maps API 似乎是不可能的。有什么更好的?

方向服务在这里。

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

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

4

3 回答 3

2

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

然后,您可以根据需要自由地重新定位它。

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

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

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

于 2012-04-23T17:16:18.440 回答
2

一个简单的谷歌搜索找到了我这个相关的帖子:谷歌地图 V3 setDirections() 回调

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

Javascript 是单线程的,不具备信号量或互斥锁等同步功能。因此,无法让您的代码“等待”直到异步函数完成或将异步函数转换为同步函数。

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

于 2012-04-22T19:04:10.047 回答
1

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

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

来源:Google Maps V3 setDirections() 回调

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

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

于 2012-04-22T19:03:51.417 回答