2016-05-22 23 views
2

db.get()がpromisified APIであると仮定すると、私はこのようなコードがあると?プロミスチェーンQ.all()の機能またはプロミスチェーンgetFromDatabase()の機能。約束エラー処理の基本

また、Q.all()のようなトップレベルのエラーハンドラがある場合、ヘルパ関数でエラーを処理する必要がありますか?

+0

あなたはおそらく 'then''へnull'なので代わりの恒等関数を渡すか、単に 'catch'を使用する必要があります。 – Bergi

+0

も参照してください[連鎖の 'キャッチ'](http://stackoverflow.com/questions/16371129/chained-promises-not-passing-on-rejection)。 – Bergi

答えて

2

誰がエラーを処理しますか? 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; 
    }) 
} 
+0

だから、 'function(err){}'は 'try-catch'によく似ています。それが深く扱われて今投げられたなら、それは上に伝わらないでしょう。右? –

+0

はい、チェーンの次のハンドラ(上端)にエラーを渡すには、拒否された約束を返すかスローする必要があります。あなたのコードのようなものを返さないことは、あなたがエラーを処理したことを意味する解決済みの約束と同等です。 – dfsq

+0

ヘルパー関数にエラーハンドラがない場合はどうなりますか? –

関連する問題