簡體   English   中英

未捕獲(承諾)錯誤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM