我正在尝试填充一些本地数据,解析一系列远程调用。
当每个承诺都得到解决时,我加载数据并继续。
$q.all( [] )
方法就是这样做的:
$q.all([
this.getUserInfo(11)
.then(function (r) {
results.push(r)
}),
this.getUserConns()
.then(function (r) {
results.push(r)
}),
this.getUserCtxs()
.then(function (r) {
results.push(r)
})
])
.then(function () {
console.log(results)
})
问题是,这段代码没有弹性。
如果这些调用中的任何一个失败了,没有人会得到鱼!
将调用包装在try/catch语句中,只会导致$q.all()
完全忽略该条目,即使没有失败(请注意函数中的console.log )...
$q.all([
this.getUserInfo2(11)
.then(function (r) {
results.push(r)
}),
function () {
try {
this.getUserGroups()
.then(function (r) {
console.log(r)
results.push(r)
})
}
catch (err) {
console.log(err)
}
},
])
.then(function () {
console.log(results)
})
输出:
对象
:我该如何包装它才能变得更有弹性?
感谢@dtabuenc,我走得更远了。实现错误回调,我可以避免链的中断,并推送已解析的promises的值。
但是,控制台上仍然会显示一个严重的异常...如果我不能尝试/捕获异步请求,我如何摆脱它?
调用者代码
return $q.all([
this.getUserInfo(user_id)
.then(function (r) {
results['personal_details'] = r
}),
this.getUserConns()
.then(
function (r) {
results['connections'] = r
},
function(err) {
console.log(err)
})
])
.then(function () {
return (results)
})
被调用方代码(使用异常插入)
getUserConns: function() {
return __doCall( ws.getUserConnections, {} )
.then( function(r) {
// very generic exception injected
throw new Error
if (r && r.data['return_code'] === 0) {
return r.data['entries']
}
else {
console.log('unable to retrieve the activity - err: '+r.data['return_code'])
return null
}
})
},
发布于 2013-12-15 20:31:23
这将会起作用,但也会将错误推送到数组。
function push(r) {
results.push(r);
}
$q.all([
this.getUserInfo(11).then(push).catch(push),
this.getUserConns().then(push).catch(push),
this.getUserCtxs().then(push).catch(push)
])
.then(function () {
console.log(results);
})
你也应该提高对promises的理解,你永远不应该在promises中使用try-catch
-当使用promises时,你使用.catch()
方法(其他的都是隐式的try
)。这对正常错误和异步错误都有效。
如果您想要完全忽略这些错误:
function push(r) {
results.push(r);
}
function noop() {}
$q.all([
this.getUserInfo(11).then(push).catch(noop),
this.getUserConns().then(push).catch(noop),
this.getUserCtxs().then(push).catch(noop)
])
.then(function () {
console.log(results);
})
发布于 2015-10-14 20:28:22
我认为这样做更容易:
$q.all([
mypromise1.$promise.catch(angular.noop),
mypromise2.$promise.catch(angular.noop),
mypromise1.$promise.catch(angular.noop)
])
.then(function success(data) {
//.....
});
发布于 2013-12-13 18:05:58
我不知道你说的弹性是什么意思。如果其中一个承诺失败了,你希望发生什么?
您的try-catch将不起作用,因为promise将异步失败。
但是,您可以将错误处理程序作为第二个参数传递给then()
调用,并在那里做任何您想做的事情。
https://stackoverflow.com/questions/20563042
复制相似问题