我有一个基于承诺的库(对于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);
};
答案 0 :(得分:0)
Javascript不允许真正的多重原型继承。
您可以“延伸”Error
但子类不能同时为instanceof
Error
和Array
。
如果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的解决方法。