通常是一个异步函数,比方说async(arg, cb)
,在末尾提供一个回调函数占位符(cb
),这样您就可以运行自己的代码异步例程结束。如果异步函数没有回调参数怎么办?很明显 cb
缺少:
async(args);
myFunction();
myFunction()
将首先运行。如何让 myFunction()
仅在 async
结束后运行?我尝试编写自己的回调包装器但没有成功;他们只是重定向函数调用。
编辑 我对上述问题的答案很感兴趣,但我将举例说明我是如何遇到这种情况的。
我的示例是在 Google map 路线服务中。异步函数是一个名为 directionsDisplay.setDirections(result);
的绘图例程,我想在绘图完成后重新居中并放大。我将一个 3 秒的 setTimeout
放在一起,以便我想要的发生,但这是一个笨拙的解决方案。改变 Google Maps API 似乎是不可能的。还有什么比这更好的?
路线服务在这里。
只需在任一下拉列表中选择一个城市即可。 3 秒后 map 应该移动。
最佳答案
通过简单的 Google 搜索,我找到了这篇相关帖子:Google Maps V3 setDirections() callback
其中显示了在方向改变时添加事件监听器。
Javascript 是单线程的,没有信号量或互斥量等同步功能。因此,无法让您的代码“等待”直到异步函数完成或将异步函数转换为同步函数。
解决这个问题的唯一方法是使用事件处理程序和/或回调函数。任何自尊的 API 提供者都不会为您提供一个异步函数的 API,而您却无法知道它何时完成。如果他们这样做,那将是一个非常糟糕的 API,您必须进入该 API 的源代码实现,找到处理事件完成的位置并安装回调(通过修改原始源代码)。除非他们已经在设计中提供完成事件或完成回调,否则您无法从代码“外部”执行任何其他操作。
关于javascript - 检测不提供回调的异步函数的执行结束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10271039/