どう

2015-12-12 6 views
5

すべてに応じて、次に/キャッチをした約束を決定するために:私は約束するかなり新しいですどう

、ここでの例です:

var someAsyncThing = function() { 
    return new Promise(function(resolve, reject) { 
    // this will throw, x does not exist 
    resolve(x + 2); 
    }); 
}; 

var someOtherAsyncThing = function() { 
    return new Promise(function(resolve, reject) { 
    reject('something went wrong'); 
    }); 
}; 

someAsyncThing().then(function() { 
    return someOtherAsyncThing(); 
}).catch(function(error) { 
    console.log('oh no', error); 
}); 

私はかなりどのように.then(得ることはありません)プロミスと協力して、今すぐ私はsomeAsyncThing()プロンプトを返すことを理解することができます。これは例外を生成し、したがって.catch()部分に移動します。我々はresolve(x+2)resolve(4)に変更した場合と、それは

最初の質問は.thenのリターンは()という約束である場合で、別の約束をsomeOtherAsyncThing();を実行し、返すために行くのだろうか?

そして2つ目の質問someOtherAsyncThing()の約束で、私は例外を引き起こすことがresolve(x+2)を使用する場合、それはまた.catch()同じ部分に行きます、そしてどのように私は.catch()のみキャッチ例外が起因することを確認することができますsomeAsyncThing()の約束(もし何かがあれば、同じ質問がチェーン.then()にあります)? .then()の戻り値は、その約束である場合

おかげ

+0

catchは、例外に関するより豊富な情報を得るために、または例外をスローしたことによって何か違うことをするために、チェーン内の例外を捕捉します。キャッチブロック内にあります。 – PixMach

+0

@PixMachありがとう、それを得ました。これは本当に柔軟性があり、堪能ではありません。 – Kuan

答えて

3

最初の質問はありますか?

p.then()は常に約束を返します。 .then()ハンドラに渡されたコールバックが値を返すと、新しく返された約束は親の約束と同時に解決されますが、ハンドラから返された値で解決されます。

.then()ハンドラが約束を返す場合、ハンドラによって返される約束が完全に満たされ/拒否されるまで、.then()によって返される約束は満たされない/拒否されません。彼らは連鎖しています。

.then()ハンドラがスローした場合、.then()によって返される約束は であり、値として例外が拒否されます。捨てることは、拒否された約束を返すことと同じです。

someOtherAsyncThing()であれば

の約束の約束、私は に例外が発生する resolve(x+2)を使用し、それはまた .catch()同じ部分に行きます、そしてどのように 私は .catch()のみキャッチ例外は someAsyncThing()によって引き起こされることを確認することができます " (もしあれば、同じ質問が .then() )?

約束の美しさは、エラーが処理されるまでチェーンまで伝播することです。どのレベルでエラー伝搬を停止するかは、そのエラーを処理することです。

.catch()チャンスを分離する場合は、より低いレベルでキャッチするだけです。例:

someAsyncThing().then(function() { 
    return someOtherAsyncThing().catch(function(err) { 
     // someOtherAsyncThing rejected here 
     // you can handle that rejection here and decide how you want to proceed 

     // for example, suppose you just want to handle the rejection, log it 
     // and then continue on as if there was no problem, you can just return 
     // a value here 
     return 0; 
    }); 
}).catch(function(error) { 
    console.log('oh no', error); 
}); 
+0

ありがとう、それを得ました。これは本当に柔軟性があり、理解するのは少し難しいです。約束を話すリンクがありますか?理解しやすいですか? – Kuan

+0

@Kuan - 私は好きなリファレンスを持っていません。これは、それがかなりうまくカバーするように見えます:http://trevorburnham.com/presentations/flow-control-with-promises/#/。 'promise'タグでここにある質問にちょうど従うならば、ここに質問に答えたり、コメントしたりする主要な約束図書館の著者や支持者を見つけることができます。 – jfriend00

+0

ありがとう、私はそれを読むでしょう。 – Kuan

3

エラーは、キャッチされるまで約束を破ります。

次のしている場合(<=含ま示す):

Promise1 <= Promise2.catch(e) <= Promise3 <= throw 

その後Promise3をスローし、拒否します。 Promise2は拒否し、捕まえられます。 Promise1は拒否を受け取っていないため、正常に解決されます。

Promise1 <= Promise2.catch(e) <= Promise3 <= throw 
^ resolves^rejects   ^rejects 

async as try/catchとしてください。

Promise1 = Promise.reject(err); // or throw 

Promise2 = Promise1.catch(err => { 
    // error caught 
}); 

Promise3 = Promise1.catch(err => { 
    throw err; 
    // error not caught but thrown back 
}); 

// Now Promise1 is rejected. Promise2 is resolved. Promise3 is rejected. 

then/catchコールで新しいPromiseが作成されることも知っておく必要があります。 Promises/A+ specを読んで参考にしてください。

+0

ありがとう、私の場合はsomeOtherAsyncThing()によって返されたものと同じ/キャッチで作成された約束ですか? – Kuan

+0

それぞれの 'then/catch'は新しい約束を作成します。 'then'コールバックは' nextTick'で実行されるので、同期操作でもありません。仕様を読んで、それは本当に便利です:) – Louy

+0

あなたのケースでは、 'someOtherAsyncThing'約束は' catch'メソッドを呼び出しても存在しません。 'then/catch'を呼び出すことは同期操作であり、複製の約束は非同期であることに注意してください。 – Louy

2

することはできインナー約束のcatch()

a().then(function() { 
    return b().catch(function() { 
    console.log('boo'); 
    }); 
}).catch(function(error) { 
    console.log('oh no', error); 
}); 

a()もし拒否、"oh no"が記録されます。 b()が拒否された場合、"boo"は記録されますが、"oh no"は記録されません。

+0

ありがとう、基本的にキャッチの文脈は私の場合、その中のどのようなものに応じて変わるでしょうか? – Kuan

+0

プロミスチェーンがどのように機能するのか他の回答を見てください。 –