节点8.6 javascript承诺:未处理PromisejectionWarning

节点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

我有一个错误:(节点:6186)未处理的PromisejectionWarning:未处理的承诺拒绝(拒绝id:1):三个p (节点:6186)[DEP0018]弃用警告:未处理的承诺拒绝已弃用。将来,未处理的承诺拒绝将使用非零退出代码终止Node.js进程。 --------一个 =============两个 CaughtCathchError三人组 (节点:6186)PromisejectionHandledWarning:承诺拒绝已异步处理(拒绝id:1) 我以嵌套顺序使用我的3个promise函数。 p1、p2、p3-是我的承诺函数,如下所示。 我也尝试在所有p1、p2、p3函数中添加promise reject,但仍然是一样的

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需要的