2017-08-11 7 views

答えて

1

あなたは各.then()内部の約束を返却すると、エラーがでて、メインフローにチェーンされています。それに唯一の難点は、あなたがに手動で「再スロー」最初catch()からの誤差を持っているだろうということですあなたの例では、.catchメソッドはすべてのエラーをキャッチします。

は、この例を考えてみましょう。

Promise.resolve(1) 
    .then((n) => { 
    return Promise.all([ 
     Promise.resolve(`a-${n}`), 
     Promise.reject(Error('Failed in Promise.all')), // comment for success 
    ]); 
    }) 
    .then(([a, b]) => { 
    const msg = `Responses: [${a}, ${b}]`; 
    console.log(msg); 
    return msg; 
    }) 
    .catch((error) => { throw error; }); 

は、内側Promise.all()は、それは親の流れによってキャッチされ拒否されています。

ここで約束をチェーンに関するいくつか読む:.catch()が拒否された約束の値を取得し、簡単に言えば#2 Nested Promises

+1

これは明確に答えます。ありがとうございました。 – Kainan

+0

ネストされた約束についての良いリンクを追加しました;) – jherax

1

はい、あなたの最後の(例では)catch()によってキャッチされます。


また、単にPromise.all()then()後に別のcatch()を挿入することができ、その場合には、両方のcatch()-esが呼び出されます。

.then(([user, booking]) => { 
    const payment = { } 

    return Promise.all([ 
    paymentService(payment), 
    Promise.resolve(user), 
    Promise.resolve(booking) 
    ]) 
}) 
.catch((error) => { 
    // Error handling logic... 

    // Rethrow the error to allow the second catch to... catch it 
    throw error; 
}) 
.then(([paid, user, booking]) => { 
    return Promise.all([ 
    repo.makeBooking(user, booking), 
    Promise.resolve(paid), 
    Promise.resolve(user) 
    ]) 
}) 
.catch((err) => { 
    //Error handling here 
}) 
+0

素晴らしい、ありがとうございました。 – Kainan

1

を。 Promise.prototype.catch(myHandler)は、Promise.prototype.then(undefined, myHandler)を呼び出すのと同じものです。したがって、

.then()とチェーンされている約束事については、前回の約束が失敗した場合、後続の却下されたコールバックが呼び出されるということです。

ですから、次のコードを持っている場合:

Promise.resolve().then((resolve, reject) => { 
    console.log('this is the first promise'); 
    reject(); 
}).then(() => { 
    console.log('this is the second promise'); 
    reject(); 
}).catch((value) => { 
    console.log('this is the third promise') 
}); 

出力された:

これは、これが第三約束

である第一約束

ですその理由は次のとおりです。Promise.resolve()は約束を作成します。約束通り#1にしましょう。

.thenは、新しいという約束を内側の約束の返還に等しいと返します。したがって、1行目の.then()を呼び出すと、約束#2が作成されます。第2の.then()コールは約束#3を生成する。

大丈夫です。今セットアップされているので、Promise#1はすでに解決されているので、成功ケースが必要です。それが「これは最初の約束」のプリントです。ハンドラの中で#2の約束を拒否します。

プロミス#2には1つのハンドラがあります(ボディは「これは第2の約束です」)。 Promise#2は拒否されているので、このハンドラは実行されません。 **連鎖約束の仕方は、これもまた、約束#3が拒絶されることを意味する**。したがって、catch()ハンドラに到達すると、this is the third promiseの例が実行されます。

あなたはより多くの例については、ここで詳細を読むことができます:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/catch

関連する問題