2015-07-13 39 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() 
    }) 
}) 
相关问题