2015-07-13 71 views
2

我正在使用AngularJS應用程序。我有一個表格。提交時,我正在調用一個函數。我已經使用的JavaScript 的try/catch/finally塊Javascript - 最終在嘗試完成之前執行AngularJS塊

$scope.save = function() { 
      try { 
       //Block of code to try 
       $scope.submit.text = "Submitting"; 
       $scope.submit.disable = true; 
       $timeout(function(){ 
        alert('successfully saved'); 
       }, 5000); 
      } 
      catch(err) { 
       //Block of code to handle errors 
      } 
      finally { 
       alert("finally"); 
       $scope.submit.text = "Submit"; 
       $scope.submit.disable = false; 
      } 

     } 

我用一個定時器現在。但後來我可能會使用AJAX調用。問題是

finally塊在時間結束前被執行。如何解決這個問題?

+5

你需要移動你的try catch finally塊在timeout函數中,因爲timeout函數是異步的。 – nikhil

+0

請查看:http://know.cujojs.com/tutorials/async/mastering-async-error-handling-with-promises – franciscod

+0

您也可以將任何異步函數調用轉換爲'kriskowal q'-like promise對象,它在AngularJS中廣泛使用,名爲'$ q'。 – mostruash

回答

4

在完成時間之前finally方法被執行的原因是javascript方法沒有運行異步。 Promises將解決這個問題。

這裏是承諾是如何在q.js其在角用於限定:

甲諾是表示返回值或拋出異常 該函數可以最終提供的對象。承諾也可以用作遠程對象的代理來克服延遲。

保證承諾之一是成功或錯誤回調將被調用,但從來都沒有。無論承諾的結果如何,如果您需要確保執行特定功能,會發生什麼情況?您可以通過使用finally()方法在承諾上註冊該功能來完成此操作。

假設你有一個函數getData()你正在做一些$ http請求並從後端獲取一些數據。然後你可以使用:

var promise = getData() 
    .then(function(data) { 
     console.log(data) 
    }, function(error) { 
     console.error(error) 
    }) 
    .finally(function() { 
     console.log() 
    }) 
}) 
相關問題