如果我有以下功能:
doTask1: function ($scope) {
var defer = $q.defer();
$http.get('/abc')
.success(function (data) {
defer.resolve();
})
.error(function () {
defer.reject();
});
return defer.promise;
},
doTask2: function ($scope) {
var defer = $q.defer();
var x = 99;
return defer.promise;
},
我被告知我可以等待这两个承诺:
$q.all([
doTask1($scope),
doTask2($scope)
])
.then(function (results) {
});
如果任务2没有返回承诺怎么办?我在$ q文档中看到过 对于AngularJS来说,有一个“何时”。但是我不知道如何使用它 而且没有例子。
是否必须让doTask2通过两行来返回一个承诺:
var defer = q.defer()
return defer.promise
还是有更简单的方法吗?ll
答案 0 :(得分:6)
以下示例/ plunker显示了一个方法,其结果在$ q.all中使用,并且每次调用时都返回不同类型的对象(int或promise):
的 PLUNKER 强>
app.controller('MainController', function($scope, $q, $http) {
var count = 0;
function doTask1() {
var defer = $q.defer();
$http.get('abc.json')
.success(function (data) {
defer.resolve(data);
})
.error(function () {
defer.reject();
});
return defer.promise;
}
/**
* This method will return different type of object
* every time it's called. Just an example of an unknown method result.
**/
function doTask2() {
count++;
var x = 99;
if(count % 2){
console.log('Returning', x);
return x;
} else {
var defer = $q.defer();
defer.resolve(x);
console.log('Returning', defer.promise);
return defer.promise;
}
}
$scope.fetchData = function(){
// At this point we don't know if doTask2 is returning 99 or promise.
// Hence we wrap it in $q.when because $q.all expects
// all array members to be promises
$q.all([
$q.when(doTask1()),
$q.when(doTask2())
])
.then(function(results){
$scope.results = results;
});
};
});
<body ng-app="myApp" ng-controller='MainController'>
<button ng-click="fetchData()">Run</button>
<pre>{{results|json}}</pre>
</body>
答案 1 :(得分:4)
是否有更简单的方法[比手动构建和解决延期并返回承诺]?
是的,请使用$q.when
function:
doTask2: function ($scope) {
return $q.when( 99 );
},
但是,您实际上并不需要这样做。 $q.all
- 虽然未在文档中说明 - 但也适用于非承诺值(实现calls _ref
转换它)。所以只是
return 99;
也很好。但是,如果事先知道它是同步的,那么使用promises似乎没有多大意义。