【问题标题】:How to chain Q promise with previous errors on finally()如何在 finally() 上将 Q 承诺与先前的错误链接起来
【发布时间】:2014-09-11 08:43:33
【问题描述】:

我想知道如何使用 finally 链接 Q 上的错误。

考虑下面的代码

function p1() {
    throw new Error("p1 error");
}

function p2() {
    throw new Error("p2 error");
}

function p3() {
    return Q.fcall(p1)
        .finally(function () {
            return Q.fcall(p2);
        }); 
}

p3()
    .done();

带有消息“p1 错误”的错误丢失,因为它被错误“p2 错误”覆盖。如何抛出所有错误(或合并错误)?

目前,我正在处理 nodejs 上的套接字连接。我使用 .finally() 在每次连接后关闭套接字。

但是,.finally() 之前的错误(例如:身份验证错误)将被 .finally() 中的一个覆盖(例如:连接关闭错误)。所以,我想知道如何获取所有错误

谢谢

【问题讨论】:

  • 谢谢,但该链接对我的主题不是很有帮助。这个博客告诉你如何在 Promise 链之外捕获错误,而不是在链内的每个 then() 上放置错误处理程序。这样做的效果类似于通过抛出错误来终止中间的链。然而,我的案例是关于 finally() 的棘手部分。 finally() 拦截原始错误并将其替换为新错误。

标签: javascript promise q


【解决方案1】:

你可以这样做:

function p3() {
    return Q.fcall(p1)
    .finally(function(p) {
        return Q.fcall(p2).catch(function(e) {
            if (!p.isRejected()) throw e;
            var agg = new Error("multiple errors occured");
            agg[0] = p.inspect().reason;
            agg[1] = e;
            agg.length = 2;
            throw agg;
        });
    }); 
}

(基于Bluebird's AggregateError

当然很乏味,但我想不出比这更好的了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-15
    • 1970-01-01
    • 2015-02-04
    • 1970-01-01
    • 2014-10-31
    • 1970-01-01
    相关资源
    最近更新 更多