节点8.6 javascript承诺:未处理PromisejectionWarning
我有一个错误:(节点:6186)未处理的PromisejectionWarning:未处理的承诺拒绝(拒绝id:1):三个p (节点:6186)[DEP0018]弃用警告:未处理的承诺拒绝已弃用。将来,未处理的承诺拒绝将使用非零退出代码终止Node.js进程。 --------一个 =============两个 CaughtCathchError三人组 (节点:6186)PromisejectionHandledWarning:承诺拒绝已异步处理(拒绝id:1) 我以嵌套顺序使用我的3个promise函数。 p1、p2、p3-是我的承诺函数,如下所示。 我也尝试在所有p1、p2、p3函数中添加promise reject,但仍然是一样的节点8.6 javascript承诺:未处理PromisejectionWarning,javascript,node.js,promise,Javascript,Node.js,Promise,我有一个错误:(节点:6186)未处理的PromisejectionWarning:未处理的承诺拒绝(拒绝id:1):三个p (节点:6186)[DEP0018]弃用警告:未处理的承诺拒绝已弃用。将来,未处理的承诺拒绝将使用非零退出代码终止Node.js进程。 --------一个 =============两个 CaughtCathchError三人组 (节点:6186)PromisejectionHandledWarning:承诺拒绝已异步处理(拒绝id:1) 我以嵌套顺序使用我的3个pro
enter code here
var p1 = new Promise(function (resolve, reject) {
setTimeout(function () {
// resolve('ones')
resolve('ones')
}, 9000)
})
var p2 = new Promise(function (resolve, reject) {
setTimeout(function () {
// throw new Error('eeeee');
//reject('two')
resolve('two')
}, 1000)
})
var p3 = new Promise(function (resolve, reject) {
setTimeout(function () {
reject('three')
}, 4000)
})
p1.then(function(result){
console.log("--------", result)
// return p2.then(function(res){console.log(res)}).catch(function(err){console.log(err)})
return p2
}).then(function(p2result){
console.log("=========", p2result)
return p3;
}).then(function(p3result){
console.log('*********', p3result)
}).catch(function(err){
console.log("CaughtCathchError", err)
})
p3
是一个独立的承诺,没有.catch
。因此,当p3
被拒绝
ed时,您会得到未处理的PromisejectionWarning
。即使p3
在具有适当的catch
的Promise
链中稍后被消费,p3
本身也没有catch
您可以使用返回承诺的函数,而不是p3
,并确保捕获对该函数的所有调用:
var p1=新承诺(函数(解析、拒绝){
setTimeout(函数(){
//解析('one')
解析('one')
}, 1000)
})
var p2=新承诺(功能(解决、拒绝){
setTimeout(函数(){
//抛出新错误('eeeee');
//拒绝(“两个”)
解决(“两个”)
}, 1000)
})
var getp3=()=>新承诺(函数(解析、拒绝){
setTimeout(函数(){
拒绝(“三个”)
}, 1000)
})
p1.然后(函数(结果){
console.log(“----------”,结果)
//返回p2.then(函数(res){console.log(res)}).catch(函数(err){console.log(err)})
返回p2
}).then(函数(结果){
console.log(“=============”,p2result)
返回getp3();
}).then(函数(p3result){
console.log('********',p3result)
}).catch(函数(err){
log(“CaughtCathchError”,err)
})
如果要创建拒绝/拒绝的承诺,该承诺将在队列中而不是堆栈中捕获,则可以执行以下操作:
var p3 = new Promise(function (resolve, reject) {
setTimeout(function () {
reject('three')
}, 400)
});
//do not warn for p3 rejection but if you use it later (p3.then) or
// return it in a promise chain you will have to catch it again
p3.catch(ignore=>ignore);
Node.js promise实现希望被拒绝的承诺与catch(…)
或链接,然后(…,…)
同步,否则会出现PromisejectionHandleWarning
。未经处理的拒绝承诺可能导致将来的例外情况
通常,拒绝应该被视为任何其他错误,因此它最好是error
的实例,而不是普通字符串。然后可以这样处理:
class ExpectedRejection extends Error {}
var p3 = new Promise(function (resolve, reject) {
setTimeout(function () {
resolve(new ExpectedRejection('three'))
}, 4000)
})
...
.then(function(p3result){
if (p3result instanceof ExpectedRejection)
throw p3result;
console.log('*********', p3result)
}).catch(function(err){
console.log("CaughtCathchError", err)
})
ExpectedRejection
类是特定的,可能不需要;由于Error
分辨率不常见,因此可以到处替换为Error
此解决方案并不常见,因为如果同时创建承诺,则它们彼此不依赖,通常可以使用承诺进行处理。所有:
Promise.all([p1, p2, p3])
.then(function(p1result, p2result, p3result){
console.log('*********', p3result)
}).catch(function(err){
console.log("CaughtCathchError", err)
});
请注意,由于p1
,p2
和p3
是同时创建的延迟,因此在这两种情况下,catch
将在9秒(延迟的最大持续时间)后触发。请参见该行p3=新承诺
等?您没有处理拒绝这基本上是未处理拒绝检测逻辑中的一个限制,它报告未处理的拒绝,即使拒绝最终出现在.catch()
中。不过,这意味着p3在p2解决之前不会启动-这可能不是OP需要的