前提・実現したいこと
JavascriptのPromiseについて学習中です
MDNでPromiseのcatchメソッドのページをみました
発生している問題・エラーメッセージ
Promiseのcatchメソッドではthrow文を使うことでreturn reject()
を実行したような動きをできてそれをcatchメソッドでキャッチできると認識してます
ですがこれは、setTimeoutなど非同期に実行される関数の中ではcatchできず、rejectを実行したような動きになりませんでした
該当のソースコード
コード1
Javascript
1var promise1 = new Promise(() => { 2 throw "まずいエラー"; // throw(reject)されたので 3}).catch(e => { 4 console.log("まずいことが起きた"); 5 console.log(e); 6}); 7// まずいことが起きた キャッチしたのでエラー処理ができる 8// まずいエラー
コード2
Javascript
1var promise2 = new Promise(() => { 2 setTimeout(() => { 3 throw "まずいエラー"; // throw(reject)されたので 4 }, 1000); 5}).catch(e => { 6 console.log("まずいことが起きた"); // catchできるはずが・・・ 7 console.log(e); 8}); 9// uncaught exception: まずいエラー が発生してしまう
コード3
コード2のthrowをreturn rejectに変えたバージョン(結果はコード2とおんなじ)
javascript
1var promise3 = new Promise(() => { 2 setTimeout(() => { 3 return Promise.reject("まずいエラー"); 4 }, 1000); 5}).catch(e => { 6 console.log("まずいことが起きた"); // catchできるはずが・・・ 7 console.log(e); 8}); 9// uncaught exception: まずいエラー が発生してしまう
試したこと
コード1を実行したあとにpromise1変数の中身をみたらstateがfulfilledになっていて、非同期処理が完了した状態になっていた
しかし、コード2ではthrowが実行されてもpendingのままになっていた
setTimeoutはPromise内部でも非同期で実行されるからこういう動きになるのか・・・?と考えたんですが
非同期で実行しているPromise内でsetTimeoutが非同期的に実行されるってなんだよ?という疑問が生まれてしまい、いまいち全体的な動きが理解できずにいます
補足情報(FW/ツールのバージョンなど)
ブラウザのコンソールで確認してます
よろしくお願いします

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/09/17 23:33 編集
2018/09/17 23:44
2018/09/18 01:16