2013-05-01 22 views
1

如果標題混淆,我很抱歉。處理調用可能不再可用的變量的異步函數的最佳做法是什麼?

我有一種情況,用戶可以打開/關閉對話框。

當對話框打開時,會調用一系列異步函數(在webworkers的情況下)。

當這些操作完成時,用戶仍然可以關閉對話框。

當我們清理了一大堆與所討論的對話有關的變量和數據時,這意味着當工作人員返回它所需要的變量時將不再可用。

這很好,因爲我們不再需要工作人員的結果,但當然,如果快速關閉對話框,它會拋出javascript錯誤。

什麼被認爲是處理這個問題的最佳做法?我應該把整個事情放在try/catch語句中嗎?

請注意:這個問題不是特定於webworkers(我知道我可以使用worker.terminate),所以請一般圍繞異步函數構造任何答案。

在此先感謝。

編輯:

這裏是我的意思是:

EXAMPLE.dialog = { 
       init : function(){ 
          this.cache = { 
            //imagine lots of properties listed here 
          } 
          this.buildDialog(); 
       } 
       buildDialog : function(){ 
          //The dialog is built here 

          startFunctions(); 
       } 
       startFunctions : function(){ 
          //Perform several asynchronous functions here 
          //All of which reference this.cache.properties when they return 
       }, 
       destroyDialog : function(){ 
          //Dialog gets destroyed in DOM 
          delete this.cache; 
       }  

} 

SOLUTION:好愚蠢,同時輸入這個例子了實現一個非常簡單的解決方案,不需要使用try/catch 。通過構建一個父屬性下的所有必需屬性(在本例中爲this.cache),我可以簡單地檢查返回的異步函數中是否存在一個屬性。

以前的屬性不是以這種方式構建的,這意味着檢查每個單獨的一個將是單調乏味和膨脹。我很抱歉沒有意識到這一點。

上面給任何人閱讀的代碼應該被看作是一個解決方案,而不是一個問題的例子。

+0

這是一個錯誤,那麼解決它。 – djechlin 2013-05-01 16:01:24

+1

你能告訴我們你正在使用的是什麼的代碼示例? – 2013-05-01 16:01:25

+0

@RickViscomi並主張確切的代碼將是毫無意義的,矯枉過正,所以我就敲了一下,我們所面對的是一個很小的例子。 – gordyr 2013-05-01 16:05:32

回答

2

不用擔心可能或不可以設置的單個對象屬性 - 爲什麼不創建一箇中間狀態來表示工作者函數是否有地方寫結果?在你的具體例子中,這由對話框是否打開來控制。

從你的描述我的理解是這樣的:

  • 如果對話框打開 - 返回的工人將填充某些對象的屬性
  • 如果對話框關閉 - 返回的工人將不填充一些對象屬性

因此,通過確定是否允許他們填充數據(由對話框狀態決定)來確定您的工作人員的回調/返回功能。如果它是開放的,你可以很好地填充 - 如果它被關閉,你可以定義一些其他行爲。

我認爲這將是更好地瞄準一個通用的解決方案是不夫婦對話框工人羣體的標誌,這樣,如果在未來的GUI改變你沒有工人功能尋找規則直接在對話框狀態。

-1

呃,只要檢查變量是否存在?

+0

這真的不是在這種情況下簡單。我們將引用大量可能存在或不存在的對象屬性。當然,檢查變量的存在是可行的,但這將需要大量的代碼膨脹。如果這是最佳做法,那麼我想這是我們將要走的路。但這是問題的關鍵。 – gordyr 2013-05-01 16:04:23

+0

如果(typeof運算FOO ===「未定義」)警報(「該變量是在範圍」); – MatthewMartin 2013-05-01 16:06:04

+0

@gordyr這是一個合適的解決方案。我知道這可能很費時間,但你現在將來可以從最初開始考慮這樣的事情。你可以用'try {} catch {}'來包裝每個異步代碼片段,但由於它是「巨大的」,那麼你可能會捕獲你不想捕獲的東西(並且JavaScript的異常處理很痛苦)。另外它也適用於懶惰的人。 ;) – freakish 2013-05-01 16:06:50

相關問題