节点8.6 JavaScript承诺:UnhandledPromiseRejectionWarning

时间:2018-06-30 06:20:53

标签: javascript node.js promise

我遇到错误:(节点: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)
})

3 个答案:

答案 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)
});

请注意,由于p1p2p3是同时创建的延迟,因此结果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);