私はE6 Promisesで始まります。私は非常に好きですが、私が理解していないエラー処理に関する重要な概念があり、明確化が大好きです。ES6 Promiseエラーが期待どおりにバブリングしない
の約束を返し、次の簡単な関数と仮定してみましょう:ちょうど(それに渡された文字列の約束を返し、その約束が解決または拒否することになり、
function promiseString(str, timeout, doResolve) {
return new Promise((resolve, reject) => {
setTimeout(() => {
if (doResolve) {
resolve(str);
} else {
reject(new Error("Rejecting " + str));
}
}, timeout);
});
}
それは非常に簡単ですが3番目の引数に基づいて) "timeout"ミリ秒で指定します。
次のように私は期待を完全として、これを消費することができます。
promiseString("One", 100, true)
.then((str) => { console.log("First then is " + str); return promiseString(str + " two", 100, true); })
.then((str) => { console.log("Second then is " + str); return promiseString(str + " three", 100, true); })
.then((str) => console.log(str))
.catch((err) => console.error(err));
このチェーンのコールのいずれかで「偽」から「真」に三番目の引数を変更する場合は、予想通り、私のエラーがキャッチされますconsole.error()に送信します。
しかし、今有望なオブジェクトを構築するために、以下の(同様に愚かな)関数を想像:
function DoublePromiser(str1, str2, doResolve) {
this.promise = new Promise((resolve, reject) => {
promiseString(str1, 100, doResolve)
.then((s1) => promiseString(s1 + str2, 100, doResolve))
.then((s2) => resolve(s2));
});
}
は(doResolveに設定され、解決すべてと拒否何で、次のように私はこのコードを消費することになりました想像してみて)真:
var dp = new DoublePromiser("Big", "Promise", true);
dp.promise
.then((s) => console.log("DoublePromise: " + s))
.catch((err)=>console.log("I did catch: ", err.message));
予想されるように、私は、コンソールに以下を参照してください。
DoublePromise: BigPromise
しかし、今私は(拒否するように私の約束ルーチンを引き起こす)、「偽」にdoResolveを設定し、消費するコードを変更:
var dp = new DoublePromiser("Big", "Promise", false);
dp.promise
.then((s) => console.log("DoublePromise: " + s))
.catch((err)=>console.log("I did catch: ", err.message));
ため、エラーが「バブルアップ」すべきで、私が期待する方法の私の理解で次のように記録するコンソール:
I did catch: Rejecting Big
しかし、そうではありません。代わりに、コンソールが不明なエラーを示しています
Uncaught (in promise) Error: Rejecting Big
私は私が期待して(と希望)ものを手に入れる私はこのように、DoublePromiserにおけるチェーンの最後にキャッチを追加した場合:
function DoublePromiser(str1, str2, doResolve) {
this.promise = new Promise((resolve, reject) => {
promiseString(str1, 100, doResolve)
.then((s1) => promiseString(s1 + str2, 100, doResolve))
.then((s2) => resolve(s2))
.catch((err) => reject(err)); // ADDING THIS TO MAKE IT WORK
});
}
今私は私が期待していることを得る、エラーはキャッチされていません。しかし、これは、エラーがバブルアップするという考え全体に反しているようです。同じエラーを再度拒否するだけでエラーをキャッチするのは変です。
これを簡単に動作させる方法がありませんか?
私はいくつかの基本的な概念が欠けていますか?
実際の問題を述べていないメイクアップコードを使用したこれらの100%理論的な質問は、スタックオーバーフローではうまく機能しません。 – jfriend00
また、プロミスコンストラクタanti-patternを使用しています。https://github.com/petkaantonov/bluebird/wiki/Promise-anti-patterns – jfriend00
@estus - タイトルを編集しました。 – jfriend00