簡體   English   中英

檢測不提供回調的異步函數的執行結束

[英]Detecting the end of execution of an asynchronous function that provides no callback

通常,異步函數async(arg, cb)例如async(arg, cb) )在末尾提供了回調函數占位符( cb ),因此您可以在異步例程結束時運行自己的代碼。 如果異步函數沒有回調參數怎么辦? 顯然cb在以下位置丟失:

async(args);
myFunction();

myFunction()將首先運行。 如何使myFunction()僅在async結束后運行? 我嘗試編寫自己的回調包裝程序沒有成功; 他們只是重定向函數調用。

編輯我對以上回答很感興趣,但我將舉一個例子說明我如何遇到這種情況。

我的示例在Google Maps Directions服務中。 異步函數是一個名為directionsDisplay.setDirections(result);的繪制例程directionsDisplay.setDirections(result); ,我想在繪圖完成后更新和放大。 我將setTimeout為3秒,以便實現所需的操作,但這是一個笨拙的解決方案。 更改Google Maps API似乎是不可能的。 還有什么比這更好呢?

指示服務在這里。

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

只需在任一下拉列表中選擇一個城市。 3秒后,地圖應移動。

一個簡單的Google搜索找到了以下相關帖子: Google Maps V3 setDirections()回調

該圖顯示了在方向更改時添加事件偵聽器。

Javascript是單線程的,不具有信號燈或互斥鎖之類的同步功能。 因此,無法使代碼“等待”,直到異步功能完成或將異步功能轉換為同步功能為止。

解決此問題的唯一方法是使用事件處理程序和/或回調函數。 沒有任何自尊的API提供者會為您提供異步功能的API,而沒有某種能力知道它何時完成。 如果確實如此,那將是一個非常糟糕的API,您必須進入該API的源實現,找到處理事件完成的位置並安裝回調(通過修改原始源)。 除非在設計中已經為完成事件或完成回調提供了它們,否則您無法從代碼“外部”進行其他操作。

當然,更好的解決方案-而不是讓DirectionsRenderer更新地圖,然后jsut自己再次更改地圖-是要讓DirectionsRenderer首先不要更新地圖。

然后,您可以隨意更新它。

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

可以告訴它保存起來-然后,您無需打擾任何雜亂的監聽器。

像這樣: http : //jsfiddle.net/8kbf2/1/

這應該為您提供回調/事件:

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

來源: Google Maps V3 setDirections()回調

關於您問題的另一方面:不,您不能直接同步異步調用,而無需對導致它的代碼進行任何修改或進行一些惡意覆蓋。

例如:
您可以嘗試弄清楚代碼是如何異步進行的,也許是setTimeout(func,1)調用。 然后,您可以覆蓋setTimeout函數並獲取調用,並可能向其添加回調。 但這是一個非常不干凈的解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM