在执行功能中按预期顺序面临问题。
$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
我希望function2
和function3
仅在function1
完成后执行
它的执行。
我尝试了以下方法,
$.when(
$scope.function1()
).then(
$scope.function2(),
$scope.function3()
)
尽管如此,它还没有奏效。首先执行function2然后执行function1
答案 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
功能需要看起来更像:
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。