0

またはq.jsの約束によって返される前に、カスタム エラー クラスでエラー (文字列) をラップできるようなものを使用して、遅延ラッパーを作成しようとしています。これは私が現在行っていることです:then()fail()

var getDeferred = function() {

    var deferred = q.defer();

    var reject = deferred.reject;
    deferred.reject = function(error) {

        if (!(error instanceof MyErrorClass))
            error = new MyErrorClass(error)

        return reject.apply(deferred, arguments);
    }

    return deferred;
}

したがって、アイデアは、ユーザーが次のようなことをするということです

var deferred = getDeferred();

deferred.promise.fail(function(err) {
    // err should now be instance of MyErrorClass and NOT a string
})

deferred.reject('A string error')

に渡された文字列ではなくMyErrorClass、ハンドラーに入ることが期待されます。fail()deferred.reject

上記のコードは機能しますが、理想的とは言えません。しかし、これを行うためのより良い方法はありますか?

4

2 に答える 2

1

次のように、よりきれい/より約束指向です:

var getDeferred = function() {

    var deferred = q.defer();

    deferred.promise = deferred.promise.then(null, function(error) {
        if (!(error instanceof MyErrorClass))
            error = new MyErrorClass(error)

        throw error
    }

    return deferred;
}

このようにして、非エラーを変更するエラーハンドラーをアタッチするだけですMyErrorClass。一般的には奇妙なユースケースのように思えますが...

于 2013-11-14T23:50:36.217 に答える
0

失敗したケースをthen次のようにマップするだけです。

actualPromise.then(null, function(error) {
    if (!(error instanceof MyErrorClass))
        error = new MyErrorClass(error)
    throw error;
})
.fail(function(err) {
    // err is now an instance of MyErrorClass and NOT a string
});

ラッパー機能が必要な場合は、上記のコードでactualPromiseと を呼び出す関数を使用します。then

于 2013-11-14T23:54:01.330 に答える