我遇到错误:(节点:6186)UnhandledPromiseRejectionWarning:未处理的承诺拒绝(拒绝ID:1):threep (节点:6186)[DEP0018] DeprecationWarning:已弃用未处理的承诺拒绝。将来,未处理的承诺拒绝将以非零退出代码终止Node.js进程。 -------- =========两个 CaughtCathchError三重 (节点:6186)PromiseRejectionHandledWarning:异步拒绝承诺(拒绝ID:1) 我正在按嵌套顺序使用3个promise函数。 p1,p2,p3-是我的promise函数,如下所示。 我也尝试在所有p1,p2,p3函数中添加promise拒绝,但仍然保持不变
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)
})
答案 0 :(得分:3)
p3
是一个没有.catch
的独立承诺。因此,当p3
得到reject
时,您得到UnhandledPromiseRejectionWarning
。即使p3
在具有适当Promise
的{{1}}链中被以后消耗,catch
本身也没有p3
您可以使用返回一个catch
的函数来代替p3
,并确保捕获到对该函数的所有调用:
Promise
如果您需要立即初始化var p1 = new Promise(function (resolve, reject) {
setTimeout(function () {
// resolve('ones')
resolve('ones')
}, 1000)
})
var p2 = new Promise(function (resolve, reject) {
setTimeout(function () {
// throw new Error('eeeee');
//reject('two')
resolve('two')
}, 1000)
})
var getp3 = () => new Promise(function (resolve, reject) {
setTimeout(function () {
reject('three')
}, 1000)
})
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 getp3();
}).then(function(p3result){
console.log('*********', p3result)
}).catch(function(err){
console.log("CaughtCathchError", err)
})
,请在p3
本身后面放置一个catch
。
答案 1 :(得分:1)
Node.js承诺实现期望被拒绝的承诺与catch(...)
或then(..., ...)
同步链接,否则出现PromiseRejectionHandledWarning
。未处理的承诺拒绝可能会在将来导致异常。
通常,拒绝应被视为其他任何错误,因此最好将其作为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
来处理:
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秒(最大持续时间为在这两种情况下都是如此。
答案 2 :(得分:0)
如果您要创建将在队列中而不是堆栈中捕获的拒绝/拒绝承诺,则可以执行以下操作:
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);