我正在尝试填充一些本地数据,以解决一系列远程调用。 当每个诺言都得到解决后,我将加载数据并继续。
该方法$q.all( [] )正是这样做的:
$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()即使没有失败也只会导致完全忽略该条目(请注意func中的console.log)…
$q.all()
$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,我走了更进一步。实现错误回调,我可以避免中断链,并推送已解决的Promise的值。
但是,控制台上仍显示令人讨厌的异常…如果无法尝试/捕获异步请求,该如何解决?
来电显示
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 } }) },
这将起作用,但也会将错误推送到阵列。
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); })
您还应该提高对Promise的理解, 永远不要try-catch与Promise一起使用- 使用Promise时,请使用.catch()方法(其他所有内容都隐含a try)。这适用于普通错误以及异步错误。
try-catch
.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); })