Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将带有错误的数组组合到单个类型中_Javascript_Arrays_Node.js_Promise_Bluebird - Fatal编程技术网

Javascript 将带有错误的数组组合到单个类型中

Javascript 将带有错误的数组组合到单个类型中,javascript,arrays,node.js,promise,bluebird,Javascript,Arrays,Node.js,Promise,Bluebird,我有一个基于promise的库(用于Node.js 0.10-6.x),它的方法是使用数组拒绝 当使用它时,会出现警告:承诺被拒绝,但没有错误 将数组包装成自定义错误类型很容易,但我希望避免破坏库的向后兼容性 有没有可能实现这样一个可以用作数组的对象,同时被视为错误对象 附加服务 从Error继承时,为了与Node.js 0.10-0.12兼容,我使用以下帮助程序: function inherits(child, parent) { child.prototype.__proto__

我有一个基于promise的库(用于Node.js 0.10-6.x),它的方法是使用
数组拒绝

当使用它时,会出现警告:
承诺被拒绝,但没有错误

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

有没有可能实现这样一个可以用作数组的对象,同时被视为
错误
对象

附加服务

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

function inherits(child, parent) {
    child.prototype.__proto__ = parent.prototype;
}
从源头上看,也许有一种方法可以绕过它的验证:

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

只要您的环境允许子类化
错误
,就可以

我问了一些类似的问题,这基本上就是你想要做的。事实上,我已经做了类似的事情来创建包含响应状态代码的HTTP特定错误

假设您的环境允许
类子错误扩展错误
(如果不允许,还有一个解决方法),您只需执行以下操作:

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;
  }
}
如果您使用的旧浏览器不允许您对
错误
进行子类化,则可以使用该示例中的
扩展错误
中的垫片类,并将其替换为
扩展错误类


NodeJS将允许您
扩展错误
并启用,并为其设置。早期版本需要Mosho的变通方法。

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

您可以“扩展”
Error
,但子类不能同时是
instanceof
Error
Array

如果使用,您可以尝试子类化
数组
对象并模拟
错误
行为(接口和属性),但这在很大程度上取决于Bluebird错误检查的实现


我认为将数组值包装到错误属性/属性中更好、更健壮。

我刚刚更新了我的问题-它是专门针对Node.js(0.10-6.x)的,其中一些允许
扩展错误,而另一些则不允许。Per、v4和v5要求
使用严格的
(错误),而v6通常允许子类化错误,但v0.10和v0.12不会。我已经在Node.js 0.10-0.12下使用了一个垫片进行子类化,它可以正常工作。我想也可以在那里做?:)<代码>函数继承(child,parent){child.prototype.\uuu proto\uuu=parent.prototype;}
我相信
Error
有一些额外的属性(如堆栈跟踪),如果简单地复制原型,这些属性就会丢失。您应该试试看。
将数组值包装成错误更好、更健壮。
-正如我所说的,我问这个问题的主要原因是为了避免破坏向后兼容性。因此,您可以尝试使用错误接口(如跟踪属性等)对数组进行子类化。查看Bluebird源代码,它不使用错误的实例。但是如果他们改变它,你将来可能会有问题。