2013-03-28 56 views
2

可以從/退出調用者函數JavaScript嗎?如何退出JavaScript中的調用者函數?

我們正在向我們的框架中添加測試方法,如果我們在斷言上有錯誤,我們想退出。

考慮下面的簡單示例代碼,我想的東西,將退出(相當於在做測試的回報)的方法Test123交換EXIT_TEST_THAT_CALLED_ME。

Assert = function (expectedTrue, comment) { 
    if(! expectedTrue) { 
     Log.Error(comment); 
     EXIT_TEST_THAT_CALLED_ME;  
    } 
} 

Test123 (...) { 

    var inputField = getInputField(".input"); 
    Assert((inputField !== null), "Checking that we found an input field"); 

    inputField.doSomething(); 
    // This row will cause run time error if inputField is null 

} 

我已經試過
回報 - 當然不是作品,因爲它只能從斷言方法
arguments.callee.caller.return返回 - 不執行任何操作
參數。 callee.caller.return() - 沒有方法「返回」

注意
更改爲已具有此功能的測試框架並且哪裏一切都很好,這不是一個選項。 。:(

+2

爲什麼不通過例外嗎? – 2013-03-28 10:05:20

+0

@javapirate這就是我最終做的。似乎是最好的方法。 Tnx – 2013-04-02 08:13:24

回答

2

一種選擇是使用try\catch\throw

Assert = function (expectedTrue, comment) { 
    if(! expectedTrue) { 
     Log.Error(comment); 
     throw "OOPS"; 
    } 
} 

try{ 
    // function that users Assert 
    Test123 (...) 
} 

catch(err){  
    alert(err); 
    if (err=="OOPS"){ 
    //special handling for a certain exception 
    } 
} 

使用該流程中,異常被拋出的那一刻,它會向上傳播,直到它到達catch塊爲你處理異常。

另外,該例外不限於是字符串。它可以是整數,布爾值或對象。

+0

拋出異常似乎是正確的事情。謝謝 – 2013-04-02 08:12:52

1

我不認爲這是可能從一個函數退出主叫我建議一些解決方法:

1.Return值與Assert,然後在調用者做return

Assert = function (expectedTrue, comment) { 
      if(! expectedTrue) { 
       Log.Error(comment); 
       return false;  
      } 
      return true; 
     }  
Test123 (...) { 
     var assertResult = Assert((inputField !== null), "Checking that we found an input field"); 
     if (!assertResult) 
      return; 
     inputField.doSomething(); 
    } 

2.發送一個回調函數到您的Assert

Assert = function (expectedTrue, comment, success) { 
      if(! expectedTrue) { 
       Log.Error(comment); 
       return;  
      } 
      success(); 
     } 
assertSuccess = function() { 
    inputField.doSomething(); 
} 
Test123 (...) { 
    Assert((inputField !== null), "Checking that we found an input field", assertSuccess); 
} 
+0

完全同意#1。關於#2,斷言通常用於測試一些不好的事情,說「不應該發生」。恕我直言,當一個斷言失敗時,發送一個回調函數來「做」,因爲斷言更像是「所有希望都會丟失」類型錯誤:) – OpherV 2013-03-28 10:19:21

+0

發送失敗斷言的回調,不會改變流,並且'doSomething()'方法將被擊中。我更喜歡#1,但#2仍然是一種選擇。 – 2013-03-28 10:22:50

1

這是不可能改變你的調用者的執行流程,這是通過設計。

你可以做的是:

  • 拋出異常。它會冒泡,直到它被抓到某個地方,快速退出來電者。
  • 更改您的測試功能以創建條件返回,如if (!assert(…)) return;