【问题标题】:node 8.6 javascript promises: UnhandledPromiseRejectionWarning节点 8.6 javascript 承诺:UnhandledPromiseRejectionWarning
【发布时间】:2018-12-09 06:32:33
【问题描述】:

我有一个错误:(node:6186) UnhandledPromiseRejectionWarning: Unhandled Promise Rejection (rejection id: 1):threep (节点:6186)[DEP0018] DeprecationWarning:不推荐使用未处理的承诺拒绝。将来,未处理的 Promise 拒绝将使用非零退出代码终止 Node.js 进程。 -------- 那些 ========= 两个 CaughtCathchError 三 (node:6186) PromiseRejectionHandledWarning: Promise 拒绝被异步处理(rejection 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 = new Promise 等?你没有处理那个拒绝
  • 这基本上是未处理拒绝检测逻辑中的一个限制,即使拒绝确实以.catch() 结尾,它也会报告未处理拒绝。

标签: javascript node.js promise


【解决方案1】:

p3 是一个独立的 Promise,没有 .catch。所以,当p3 得到rejected 时,你得到一个UnhandledPromiseRejectionWarning。即使p3稍后在具有适当catchPromise 链中使用,p3 本身也没有catch

您可以使用返回Promise函数,而不是p3,并确保捕获对该函数的所有调用:

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,则在p3 本身之后放置一个catch

【讨论】:

  • 不过,这意味着 p3 在 p2 解决之前不会启动 - 这可能不是 OP 所需要的
【解决方案2】:

Node.js 承诺实现期望被拒绝的承诺与catch(...)then(..., ...) 同步链接,否则出现PromiseRejectionHandledWarning。未处理的 Promise 拒绝将来可能会导致异常。

通常应将拒绝视为任何其他错误,因此最好将其作为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,它们之间不会相互依赖,通常可以用 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 秒(延迟的最大持续时间)后触发。

【讨论】:

    【解决方案3】:

    如果您想创建一个将在队列中而不是在堆栈中捕获的拒绝/拒绝承诺,那么您可以执行以下操作:

    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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-17
      • 2021-12-23
      • 2018-09-26
      • 1970-01-01
      相关资源
      最近更新 更多