Javascript-最终在try块使用AngularJS完成之前执行

Javascript-最终在try块使用AngularJS完成之前执行,javascript,angularjs,Javascript,Angularjs,我正在使用AngularJS应用程序。我有一张表格。在提交时,我正在调用一个函数。我使用了javascripttry/catch/finally块 $scope.save = function() { try { //Block of code to try $scope.submit.text = "Submitting"; $scope.submit.disable = true;

我正在使用AngularJS应用程序。我有一张表格。在提交时,我正在调用一个函数。我使用了javascripttry/catch/finally块

$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方法的原因是javascript方法不是异步运行的<代码>承诺将解决此问题

以下是如何定义promise的,其中在angular中使用:

承诺是表示返回值或抛出值的对象 函数最终可能提供的异常。承诺也可以 可以用作远程对象的代理以克服延迟

承诺的保证之一是调用成功或错误回调,但绝不同时调用两者。如果您需要确保特定函数的执行,而不管承诺的结果如何,会发生什么情况?您可以通过使用
finally()
方法在promise上注册该函数来实现这一点

假设您有一个函数
getData()
,其中您正在发出一些$http请求并从后端获取一些数据。然后您可以使用:

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

由于超时函数是异步的,您需要在超时函数中移动try-catch-finally块。请检查:您还可以将任何异步函数调用转换为类似于promise对象的
kriskowal q
,该对象在AngularJS中广泛使用,称为
$q