Angularjs 如何使$q等待多个异步任务?
使用带有Angular的$q服务,我编写了一个异步获取数据的函数。下面的示例有点简化,但与我的生产代码类似:Angularjs 如何使$q等待多个异步任务?,angularjs,asynchronous,promise,angular-promise,Angularjs,Asynchronous,Promise,Angular Promise,使用带有Angular的$q服务,我编写了一个异步获取数据的函数。下面的示例有点简化,但与我的生产代码类似: DataService.fetchData(1) .then(function (data1) { this.data1 = data; DataService.fetchData(2) .then(function (data2) { this.data2 = data2; DataService.fetchData(3)
DataService.fetchData(1)
.then(function (data1) {
this.data1 = data;
DataService.fetchData(2)
.then(function (data2) {
this.data2 = data2;
DataService.fetchData(3)
.then(function (data3) {
this.data3 = data3;
doSomething(this.data1, this.data2, this.data3);
}, function () {
alert("failure getting data 3");
})
}, function () {
alert("failure getting data 2");
});
}, function () {
alert("failure getting data 1");
});
假设我需要进行三次异步函数调用来获取数据,如上所述。然后通过角度视图显示数据
然而,上面的代码有很大的缺陷。它很难读取,而且函数调用嵌套得很深。我想写一些类似的东西,它将进行三个异步函数调用并执行一些函数来处理数据,只有在所有三个函数都完成之后,并且在发生错误的情况下,应该只有一个错误处理函数
还应注意,函数返回异步数据的顺序未知
如何以角度进行此操作?使用:
你想要的。基本上,您将每个承诺都推送到一个数组中,并在数组中调用
$q.all
。这就是答案!我很难想象有更简洁的方法来做这件事。那么错误处理呢?@DanielAllenLangdon您可以向$q.all
的结果中添加一个.catch
处理程序,就像我添加了一个。然后如果任何承诺被拒绝,它将运行。
$q.all({
data1: fetchData(1),
data2: fetchData(2),
data3: fetchData(3)
}).then(function(d){
doSomething(d.data1, d.data2, d.data3);
});