gpt4 book ai didi

javascript - 我可以在 AngularJS 中将 $q.all 与不返回 .promise 的函数一起使用吗?

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:08:08 24 4
gpt4 key购买 nike

如果我有以下功能:

   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;
},

我被告知我可以像这样等待两个 promise:

    $q.all([
doTask1($scope),
doTask2($scope)
])
.then(function (results) {

});

如果任务 2 不返回 promise 怎么办?我在 $q 文档中看到对于 AngularJS,有一个“何时”。但是我不清楚如何使用它而且没有例子。

是不是我必须让 doTask2 通过以下两行返回一个 promise :

var defer = q.defer()
return defer.promise

或者有更简单的方法吗?会

最佳答案

$q.when 用于您事先不知道函数返回的是 promise 还是直接值的场景。

下面的例子/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>

关于javascript - 我可以在 AngularJS 中将 $q.all 与不返回 .promise 的函数一起使用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21774011/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com