2015-09-23 14 views
14

$q.promiseを使用すると、エラーコールバックとcatch関数の使用に違いがある場合は誰かに教えてください。プロミス - エラーコールバック対キャッチ

など。コードの2つのスニペットは機能的に同等ですか?

function doSomething0() { 
    var deferred = $q.defer(); 

    ... 

    return deferred.promise; 
} 

doSomething0() 
    .then(doSomething1) 
    .then(doSomething2) 
    .then(doSomething3) 
    .catch(function (err) { 
     // do something with `err` 
    }); 

function doSomething0() { 
    var deferred = $q.defer(); 

    ... 

    return deferred.promise; 
} 

function errorHandler(err) { 
    // do something with `err` 
} 

doSomething0() 
    .then(doSomething1, errorHandler) 
    .then(doSomething2, errorHandler) 
    .then(doSomething3, errorHandler); 

もしそうなら、なぜ第二1を使うのか?それははるかに醜く見えると私の意見では、より多くのコードの重複につながる?

+2

番目のバージョンは、あなたが継続することを決議状態に戻す約束を持参することができますとにかくエラーや拒否された約束以外のものを返すことによって、 –

+2

エラーハンドラが拒否された約束をスローまたは返す場合、それは3回呼び出されます。 –

答えて

4

2つ目はerrorHandlerを(1回ではなく)3回実行する点を除いて、どちらも同じ結果になります。あなたはそれがいくつかのコードの重複をもたらしていることが正しいですが、それはまた、あなたが起こったどんなエラー扱い、あなたのチェーンを続行することができます:

function errorHandler(err) { 
    //log error, continue 
    return $q.resolve('default value or something'); 
} 

doSomething0() 
    .then(doSomething1, errorHandler) 
    .then(doSomething2, errorHandler) 
    .then(doSomething3, errorHandler); 
+0

ありがとう!私はどのように関心がなくなってチェーンを続けるのですか?それともチェーンだけで続けるのだろうか? – keldar

+2

@keldar上記の例のように、エラーハンドラ関数から新しい 'Promise'を返すだけです! – Marcelo

+2

約束を返す必要はありません。単に値を返すことができます。 –

関連する問題