[英]Uncaught (in promise) Error
這顯然是一個SSCCE。 我有以下內容(jsFiddle 在此處 ):
<html>
<body>
<input id='file-dlg' type='file'/>
<br/>
<button id='submit' type='button'>submit</button>
<script>
document.getElementById('file-dlg').addEventListener('change', storeAPromise);
var p;
function storeAPromise() {
p = new Promise(function executor(resolve, reject) {
try {
throw new Error('snafu');
} catch(e) {
reject(e);
}
});
};
document.getElementById('submit').onclick = function() {
p.then(function() {}, function reject(e) {
console.error('some problem happenned', e);
});
};
</script>
</body>
</html>
當用戶使用文件對話框選擇文件時,我希望控制台上不會打印任何內容,因為會捕獲到Error
並調用promise的reject
函數。 相反,我希望只有在單擊“提交”按鈕時,錯誤才會出現在控制台上,並帶有“發生了某些錯誤”的描述。
但是,這不是我觀察到的。 用戶在對話框中選擇一個文件后,就會在控制台上看到:
Uncaught (in promise) Error: snafu(…)
當用戶按下“提交”按鈕時,我確實看到了預期的日志行“發生了某些問題”,但是當用戶選擇帶有以下內容的文件時,我不明白為什么我還會看到較早的“未捕獲(承諾)”日志行。文件對話框。 考慮到我(無條件地)捕獲了所有異常並簡單地調用了reject
函數,因此我也看不到為什么將錯誤描述為“未捕獲”。
這不是未捕獲的異常 ,而是未捕獲的拒絕 。 承諾不應在未附加錯誤回調的情況下處於拒絕狀態,這就是控制台向您發出警告的原因。 您還可以使用unhandledrejection
事件在應用程序中處理這些情況。
如果要稍后處理錯誤(當用戶單擊按鈕時安裝處理程序,這可能永遠不會!),仍然需要立即安裝一個空的回調(顯式忽略該錯誤)以禁止顯示警告。
var p = Promise.resolve();
document.getElementById('file-dlg').addEventListener('change', function createPromise() {
p = new Promise(function executor(resolve, reject) {
throw new Error('snafu');
});
p.catch(e => {/* ignore for now */});
});
document.getElementById('submit').addEventListener('click', function addErrorHandler() {
p.catch(function onReject(e) {
console.error('some problem happened', e);
});
});
請注意,您不需要那么try
/ catch
-承諾構造將默認趕上從執行所有的異常了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.