bsr*_*bsr 17 javascript promise angularjs
使用promise API,如何并行发送两个异步请求,并将组合结果解析为响应.
var get = function(id){
var res1, res2;
var deferred = $q.defer();
Db.get(id, "abc")
.then(function (d) {
//deferred.resolve(d));
res1 = d;
}, function (e) {
//error
});
Db.get(id, "def")
.then(function (d) {
//deferred.resolve(d));
res2 = d;
}, function (e) {
//error
});
//?????? how to return {res1:res1 , res2: res2}
return deferred.promise;
};
Run Code Online (Sandbox Code Playgroud)
现在,当我调用get()之类的时候
get(123).then(function(d)){
// d= {res1: res1, res2: res2}
},
...
Run Code Online (Sandbox Code Playgroud)
我需要得到所示的综合结果.如何使用Angular promise API执行此操作?
For*_*say 36
正如@Matt所说,你需要使用$q.all
,但用法并不完全正确.AngularJS不支持.done
并且.fail
它们不能完全相同,因为没有对多个值的承诺,而是你只对数组有一个承诺.
如果你用完整的Q写这个,我们会写:
var get = function (id) {
return Q.all([Db.get(id, "abc"), Db.get(id, "def")])
.spread(function (res1, res2) {
return {res1: res1, res2: res2};
});//the error case is handled automatically
};
Run Code Online (Sandbox Code Playgroud)
在这种情况下,除了它通过其函数的参数传播数组的结果以外的.spread
行为.要改变它以使用AngularJS中的promise方法,我们只需要不用.这导致以下解决方案:.then
onFulfilled
.spread
var get = function (id) {
return $q.all([Db.get(id, "abc"), Db.get(id, "def")])
.then(function (res) {
return {res1: res[0], res2: res[1]};
});//the error case is handled automatically
};
Run Code Online (Sandbox Code Playgroud)
这样做的好处在于,我们可以免于处理错误传播的所有细节和存储部分结果,因为它.then
可以充当过滤器.如果省略错误处理程序,它会自动传播任何错误.这意味着如果任何一个输入承诺被拒绝,结果将被拒绝.如果两个promise都成功完成,则res是这些分辨率值的数组.