javascript - promise 没有正确捕获错误NodeJS

标签 javascript node.js error-handling es6-promise

如果我没记错的话,Promises应该总是在抛出一个错误时捕获一个错误,以便Promise.catch()可用于处理该错误。我不记得有任何异常,但是当我在setTimeout()中抛出错误时,这种方式是行不通的。

有人可以解释为什么这行不通吗?还是仅仅是NodeJS中的错误?

测试代码

// This works!
function async() {
        return new Promise(function (resolve, reject) {
                throw new Error('test');
        });
}

async().catch(function() {
        console.log('Ok: 1');
});


// This doesn't work..
function async_fail() {
        return new Promise(function (resolve, reject) {
                setTimeout(function() {
                        throw new Error('test');
                }, 1);
        });
}

async_fail().catch(function() {
        console.log('Ok: 2');
});

最佳答案

您将永远不会捕获setTimeout中引发的错误,因为它会执行与promise函数的实际执行异步的操作。因此,在设置超时内的函数被调用时,promise本身已经完成(没有任何调用来解决或拒绝)。

如果您希望基于在setTimeout中的错误而使 promise 失败,则需要手动捕获它并调用拒绝:

setTimeout(function() {
     try{
          throw new Error('test');
     }catch(ex){
          reject(ex);
     }
}, 1);

关于javascript - promise 没有正确捕获错误NodeJS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40521242/

相关文章:

ios - 客户端和服务器上都无法使用 socket.io 连接到服务器

php - 处理@抑制的错误的正确方法?

java - 不兼容的类型 : void cannot be converted to string

JavaScript - 如何将 int 数组中的所有元素加 1

javascript - ASP.NET hiddenField 使用 ClientID 获取值(value),就像使用 javascript 使用母版页一样

javascript - 如何路由嵌入查询字符串的搜索 URL?

javascript - 是否有关于 Harp.js 和 GitHub 页面的文件夹结构的最佳实践?

python - 在 Windows 中关闭 Python 中的主程序时,通过子进程传递参数并终止子进程

javascript - Chrome - 黑盒脚本 - 没有菜单项

javascript - 使用 lodash 从嵌套数组形式的开始和结束中删除元素