一連のリモート呼び出しを解決するローカルデータをいくつか書き込もうとしています。
約束がすべて解決されると、私はデータを読み込んで処理を進めます。まさにこれを行い$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文で呼び出しをラップ
、単に...(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のおかげで、私はさらに一歩進んできました。 エラーコールバックを実装することで、チェーンの破損を回避し、解決された約束の値をプッシュすることができます。
しかし、コンソールには厄介な例外が表示されています... 非同期要求を試しても捕まえられない場合は、どうすれば取り除くことができますか?
発信者コード
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
}
})
},
実際、私はAngular、約束、さらにはJSの初心者です。私は毎日新しいことを学ぶことが大変です! .catch()メソッドは、私の最後の例で私が生成した例外を "ブロック"しませんが、理想的な結果に近づけることができると思います。 ありがとう! – domokun
@domokunアングルプロミスは、プロミス/ A +の精神に反して、キャッチされた例外を誤って報告しています。スペックを違反していない場合は – Esailija
知っておいてください...私はそう思います... Thx again! – domokun