2016-06-16 9 views
1

私はArrayで拒否するメソッドを持つ約束ベースのライブラリ(Node.js 0.10 - 6.x用)を持っています。単一タイプのエラーで配列を結合する

Bluebirdを使用すると、警告:a promise was rejected with a non-errorが発生します。

アレイをカスタムエラータイプにラップするのは簡単ですが、ライブラリの下位互換性を破壊しないようにしたいと考えています。

Bluebirdで表示されているオブジェクトを同時に実装することは可能ですか?Errorオブジェクトを同時に使用することはできますか?

エキストラ

私はNode.jsの0.10との互換性のために、次のヘルパーを使用Errorから継承する - 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); 
}; 

答えて

-1

あなたの環境ではサブクラス化が可能ですError、はい!

私はextending errors to create my own subtypesのようなものについて尋ねましたが、これは本質的にあなたがしたいことです。実際、私は、応答のステータスコードを含む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; 
    } 
} 

あなたがErrorをサブクラス化することはできません古いブラウザであれば、あなたがすることができます(とない場合の回避策があります)ご使用の環境がclass SubError extends Errorを許可しない、あなたは、単にんと仮定

@Mosho's answerのshimクラスを使用し、その例ではextends Errorextends ErrorClassに置き換えてください。

NodeJSでは、extends Errorfrom v4以降をv6 having correct/full supportとすることができます。以前のバージョンでは、Moshoの回避策が必要です。

+0

私はちょうどNode.js(0.10 - 6.x) –

+0

のために特に私の質問を更新しました。それらのいくつかは '拡張エラー'を許可しますが、いくつかはありません。 https://kangax.github.io/compat-table/es6/で、v4とv5は 'use strict'を必要とします(間違って)、v6ではエラーの一般的なサブクラス化が可能ですが、v0.10とv0.12はそうではありません。 – ssube

+0

私はすでにNode.js 0.10 - 0.12の下でサブクラス化のためにshimを使用していますが、うまく動作します。私はそれもそこで行うことができると思いますか? :) 'function継承する(子、親){ child.prototype .__ proto__ = parent.prototype; } ' –

0

Javascriptでは実際の複数のプロトタイプ継承が許可されていません。

Errorを「拡張」することはできますが、サブクラスはinstanceofErrorとの両方になることはできません。

使用duck-typingBluebird場合はArrayオブジェクトをサブクラス化しError行動(インターフェースととプロパティ)をシミュレートしようとすることができますが、これは強くブルーバードエラー・チェックの実装に依存します。

私は、Errorプロパティ/属性に配列の値をラップする方が優れていると思います。

+0

'は、配列の値をエラーにラップする方が優れています。私が述べたように、私が質問した主な理由は、後方互換性を破らないようにすることです。 –

+0

したがって、エラーインターフェイスを持つ配列のサブクラス化を試みることができます(トレースプロパティなど)。 Bluebirdソースを見ると、 'instanceof Error'は使用されません。しかし、将来変更しても問題は発生します。 – Dario

関連する問題