Mar*_*tus 1 javascript es6-promise
这显然是一个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>
Run Code Online (Sandbox Code Playgroud)
当用户使用文件对话框选择文件时,我希望在控制台上根本不会打印任何内容,因为Error会捕获到该内容reject并调用promise的功能。相反,我希望只有在单击“提交”按钮时,错误才会出现在控制台上,并带有“发生了某些错误”的描述。
但是,这不是我观察到的。用户在对话框中选择一个文件后,就会在控制台上看到:
Uncaught (in promise) Error: snafu(…)
Run Code Online (Sandbox Code Playgroud)
当用户按下“提交”按钮时,我确实看到了预期的日志行“发生了某些问题”,但是当用户选择带有以下内容的文件时,我不明白为什么我还会看到较早的“未捕获(承诺)”日志行。文件对话框。考虑到我(无条件地)捕获了所有异常并简单地调用了reject函数,因此我也看不到为什么将错误描述为“未捕获” 。
这不是未捕获的异常,而是未捕获的拒绝。不应在没有错误回调的情况下使承诺处于悬而未决的状态,这就是控制台向您发出警告的原因。您还可以使用unhandledrejectionevent在应用程序中处理这些情况。
如果要稍后处理错误(当用户单击按钮时安装处理程序,这可能永远不会!),仍然需要立即安装一个空的回调(显式忽略该错误)以禁止显示警告。
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);
});
});
Run Code Online (Sandbox Code Playgroud)
注意,您不需要try/ catch-promise构造器将默认已经捕获了执行器中的所有异常。