将Array与Error组合在一起

时间:2016-06-16 16:55:21

标签: javascript arrays node.js promise bluebird

我有一个基于承诺的库(对于Node.js 0.10 - 6.x),其方法拒绝Array

使用Bluebird时会出现警告:a promise was rejected with a non-error

将数组包装成自定义错误类型很简单,但我想避免破坏库的向后兼容性。

是否可以实现这样一个可以用作数组的对象,同时被Bluebird视为Error对象?

额外

Error继承时,我使用以下帮助程序与Node.js兼容0.10 - 0.12:

function inherits(child, parent) {
    child.prototype.__proto__ = parent.prototype;
}

在查看Bluebird来源时,也许有办法以某种方式规避其验证:

Promise.prototype._rejectCallback =
function(reason, synchronous, ignoreNonErrorWarnings) {
    var trace = util.ensureErrorObject(reason);
    var hasStack = trace === reason;
    if (!hasStack && !ignoreNonErrorWarnings && debug.warnings()) {
        var message = "a promise was rejected with a non-error: " +
            util.classString(reason);
        this._warn(message, true);
    }
    this._attachExtraTrace(trace, synchronous ? hasStack : false);
    this._reject(reason);
};

2 个答案:

答案 0 :(得分:0)

Javascript不允许真正的多重原型继承。

您可以“延伸”Error但子类不能同时为instanceof ErrorArray

如果Bluebird使用duck-typing,您可以尝试子类化Array对象并模拟Error行为(接口和属性),但这很大程度上取决于Bluebird错误检查实施

我认为将数组值包装到Error属性/属性中更好,更健壮。

答案 1 :(得分:-1)

只要你的环境允许继承Error,是的!

我在extending errors to create my own subtypes期间询问了类似的内容,这基本上就是你想做的事情。事实上,我已经做了类似的事情来创建包含响应状态代码的HTTP特定错误。

假设您的环境允许class SubError extends Error(如果没有,则会有解决方法),您只需执行以下操作:

class ErrorWithData {
  constructor(msg, data = []) {
    super(msg); // this changes with the workaround
    this._data = [].concat(data); // make a copy for safety's sake
  }

  get data() {
    return this._data;
  }
}

如果您使用的旧版浏览器不允许您继承Error,则可以使用@Mosho's answer中的填充程序类,并将该示例中的extends Error替换为{{1} }}

NodeJS将允许您使用extends ErrorClass from v4及其v6 having correct/full support。早期版本需要Mosho的解决方法。