我目前正在实施基于PDF.js的PDF查看器,并且作为其中的一部分我学习了有关承诺的对象。
我还了解到调试控制台中不会自动显示运行时错误:
PDFJS.getDocument(...).then(
function(pdfDocument){
alert(UndefinedVariable); // Not shown in console!
},
function(error){
console.log("Error occurred", error);
}
);
我没有能够找到一种在promise函数中显示运行时错误的漂亮方法,而不是像http://www.asyncdev.net/2013/07/promises-errors-and-express-js/中所述那样添加.done()
(它不适用于PDF.js)或添加.catch(function(error){ console.error(error); })
。
我知道我可以在调试器中打破运行时错误的异常,但我也会通过这样做来打破其他异常(在jQuery中),这意味着我必须在每个页面加载时执行5个jQuery异常,之后我甚至可以检查我自己的代码是否包含运行时错误。
有没有办法强制promise函数像正常一样记录运行时错误(没有为每个函数调用编写额外的代码)?
答案 0 :(得分:7)
您遇到的问题是then
回调中的异常会拒绝.then()
返回的承诺,而不是调用您传入的错误处理程序。这只会触发错误在您名为.then()
的承诺 中。所以你可以链接你的处理程序:
PDFJS.getDocument(...).then(function(pdfDocument){
alert(UndefinedVariable); // Now shown in console!
}).then(null, function(error){
console.log("Error occurred", error);
});
此处,then(null, …)
也可以缩写为catch(…)
。
如果没有done
方法throws
出现错误,您可以throw
setTimeout
{{1}}自行实施{{1}}。
有没有办法强制promise函数像正常一样记录运行时错误(没有为每个函数调用编写额外的代码)?
没有。那不是like this。
答案 1 :(得分:1)
在Promise实现中,有一个try ... catch,它从回调中获取错误并将其转换为Promise返回的错误。
你可以做的一件事就是改变那个尝试... catch来记录错误,然后再调用promise的失败。
https://github.com/mozilla/pdf.js/blob/master/src/shared/util.js#L936
} catch (ex) {
console.error(ex); // <--- add this line
nextStatus = STATUS_REJECTED;
nextValue = ex;
}
如果使用原生的ECMAScript 6承诺,这个技巧可能不起作用。