2016-10-13 9 views
2

Google Chromeで簡単なunhandledrejectionハンドラーを使用しようとしています。Chromeで処理されていない未処理の返信

私はJSFiddleに次のコードを貼り付け、Chromeでそれを実行した場合、予想通り、私は、エラーボックスを取得:

window.addEventListener('unhandledrejection', function(e) { 
    console.log(e); 
    alert(e.reason); 
}); 
new Promise(function(resolve, reject) { 
    setTimeout(function() { 
     return reject('oh noes'); 
    }, 2000); 
}); 

私が埋め込まれたスクリプトでHTMLファイルを作成し、Chromeでそれをロードする場合file:/// URLとして、期待どおりのメッセージボックスが表示されます。

<!doctype html> 
<html> 
<body> 
    <script type="text/javascript"> 
    window.addEventListener('unhandledrejection', function(e) { 
     console.log(e); 
     alert(e.reason); 
    }); 
    new Promise(function(resolve, reject) { 
     setTimeout(function() { 
      return reject('oh noes'); 
     }, 2000); 
    }); 
    </script> 
</body> 
</html> 

私は別のHTMLとJSファイルを作成し、file:/// URLとしてChromeでそれをロードした場合、私はChromeの標準「キャッチされない(約束)で」コンソールエラーが、メッセージ・ボックスを取得。

のindex.html:

<!doctype html> 
<html> 
<body> 
    <script type="text/javascript" src="app.js"></script> 
</body> 
</html> 

app.js:

window.addEventListener('unhandledrejection', function(e) { 
    console.log(e); 
    alert(e.reason); 
}); 
new Promise(function(resolve, reject) { 
    setTimeout(function() { 
     return reject('oh noes'); 
    }, 2000); 
}); 

何が起こっていますか?

答えて

5

私が知る限り、 "unhandledrejection"イベントハンドラは、別のスクリプト起源のものであれば、静かに無視されます。 (詳細については、same-origin policyのMDNを参照してください)Chromeは特にファイルURLのセキュリティの起源を持つvery strictですが、私は気付かずに同じ起源のポリシーを破ることが他の理由でも起こり得ることを発見しました(webpack- Chrome Dev Toolsを開いているサーバー)、これは驚くほど簡単に行うことができます。説明はthis Chrome issueを参照してください。

回避策は、より単純でプロダクションに近い環境でテストすることです。プレーンなHTTPサーバー(SimpleHTTPServerがうまく動作する)で実行し、必要に応じて開発ツールを閉じます。

関連する問題