繁体   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