在角度js中是否有任何方法来排序函数的执行顺序

时间:2016-11-14 10:35:59

标签: javascript jquery angularjs ajax

在执行功能中按预期顺序面临问题。

$scope.function1 = function(){
   var promiseObj= $http.get('Some Url');

  /* other logic goes here */
}

$scope.function2 = function(){
   var promiseObj= $http.get('Some Url');

  /* other logic goes here */
}

$scope.function3 = function(){
   var promiseObj= $http.get('Some Url');

  /* other logic goes here */
}

现在,想按以下顺序执行功能,

1)function1

2)function2

3)function3

我希望function2function3仅在function1完成后执行 它的执行。

我尝试了以下方法,

$.when(
  $scope.function1()
).then(
   $scope.function2(),
   $scope.function3()
      )

尽管如此,它还没有奏效。首先执行function2然后执行function1

3 个答案:

答案 0 :(得分:3)

$.when(
   $scope.function1()
).then(
  $scope.function2(),
  $scope.function3()
)

您正在将执行结果传递给回调,同时希望将then内的整个代码作为回调传递。正确的版本将是:

$.when(
  $scope.function1()
).then(function () {
  $scope.function2(),
  $scope.function3()
})

$.when似乎仍然很奇怪。你为什么要把角度与其他东西混合?只需使用:

$scope.function1().then(function () {
  $scope.function2(),
  $scope.function3()
})

确保function1返回promice。

答案 1 :(得分:2)

您的功能不会返回任何内容,但需要返回$http承诺。

由于他们没有返回承诺$.when立即解决

当angular内置$q个promise并且$http返回$ q promise

时,也不需要使用jQuery

功能需要看起来更像:

var function1 = function(){
   var promiseObj= $http.get('Some Url').then(function(response){
       var data = response.data;
       // do something to data here, and return it
       return data
   });    
   // return the promise
   return promiseObj; 
}

现在您可以执行以下操作:

function1()
  .then(function2)
  .then(function3)

或者如果第二个和第三个可以在第一个之后同时发送:

function1().then(function(func1Data){
   // can use func1Data  here if needed since it was returned to prior `then()`
   function2();
   function3();
});

另请注意,不需要将这些函数作为范围属性,因为它们不会传递给视图。仅对视图相关对象使用范围

答案 2 :(得分:0)

第一件事:您的函数必须返回一个承诺:

$scope.function1 = function(){
   var defer = $q.defer();
   var promiseObj= $http.get('Some Url');

   /* other logic goes here */
   defer.resolve(response);
   return defer.promise;
}

或者:

$scope.function1 = function(){
   return $http.get('Some Url');
}

然后你可以像这样链接你的函数:

$scope.function1.then(function(response1) {
    $scope.function2.then(function(response2) {
        $scope.function3.then(function(response3) {
            // do some stuff
        }).catch(function(err){})
    }).catch(function(err){})
}).catch(function(err){})

还有一些策略可以平展这些链,有关更多信息,请阅读this