はdb.get()
がpromisified APIであると仮定すると、私はこのようなコードがあると?プロミスチェーンQ.all()
の機能またはプロミスチェーンgetFromDatabase()
の機能。約束エラー処理の基本
また、Q.all()
のようなトップレベルのエラーハンドラがある場合、ヘルパ関数でエラーを処理する必要がありますか?
はdb.get()
がpromisified APIであると仮定すると、私はこのようなコードがあると?プロミスチェーンQ.all()
の機能またはプロミスチェーンgetFromDatabase()
の機能。約束エラー処理の基本
また、Q.all()
のようなトップレベルのエラーハンドラがある場合、ヘルパ関数でエラーを処理する必要がありますか?
誰がエラーを処理しますか? promallチェーンのQ.all()またはgetFromDatabase()のpromise chainの関数。
あなたのコードでは、エラーはgetFromDatabase()
のエラーハンドラで処理されます。しかし、あなたのケースでは、エラーはさらにQ.all()
のものに伝播することはありません。
また、Q.all()のようなトップレベルのエラーハンドラがある場合、ヘルパ関数でエラーを処理する必要がありますか?
これは、ビジネスロジック、アプリケーションの動作によって異なります。おそらく、内側のgetFromDatabase
エラーハンドラにエラーを記録し、UIレンダリングのための適切なエラーメッセージのために外部ハンドラにさらにエラーを渡したいと思うかもしれません。あなた次第。しかし、この場合には、あなたはエラーを再スローまたは内側のハンドラから拒否された約束を返す必要があります:
Q.all(promises).then(function(results){
// something
},function(error){
// Render error message for UI, etc.
});
function getFromDatabase(property){
return db.get(property).then(function(result){
return result;
},function(error){
// just log here
log.error(error);
throw error;
})
}
だから、 'function(err){}'は 'try-catch'によく似ています。それが深く扱われて今投げられたなら、それは上に伝わらないでしょう。右? –
はい、チェーンの次のハンドラ(上端)にエラーを渡すには、拒否された約束を返すかスローする必要があります。あなたのコードのようなものを返さないことは、あなたがエラーを処理したことを意味する解決済みの約束と同等です。 – dfsq
ヘルパー関数にエラーハンドラがない場合はどうなりますか? –
あなたはおそらく 'then''へnull'なので代わりの恒等関数を渡すか、単に 'catch'を使用する必要があります。 – Bergi
も参照してください[連鎖の 'キャッチ'](http://stackoverflow.com/questions/16371129/chained-promises-not-passing-on-rejection)。 – Bergi