2

promise として機能するカスタム js オブジェクトを返す必要があります。つまり、遅延オブジェクトが解決または拒否されたときに、コールバックまたはエラー コールバックをアタッチできます。このオブジェクトには、それ自体が「保留中」でない場合にのみ実行できるカスタム メソッドが必要です。それは次のようなものです:

foo = $.Deferred();

foo.a_method = function() {
    // do something only if "this" is resolved or rejected
    // throw an exception instead
};

return foo.promise();

上記のコードは機能しません。返される promise には がありませんがa_method、promise の jQuery のデフォルト メソッドのみがあります。私の考えは今:

var myMixin = {
    a_method: function() {
        // ...
    }
};

return $.extend(foo.promise(), myMixin);

このコードは期待どおりに機能しますが、すべての人に共通しているわけではなく (少なくとも私はそう思います)、理解するのは簡単ではありません。

私がそれを望む理由は、$.when($.ajax('foo'), $.ajax('bar'))うまく実行するためにいくつかの結合された ajax requests( ) に依存するライブラリがあるからです。そのため、リクエストを実行し、他のコールバックをいくつか添付して、「ドメイン固有の」メソッドを使用してこのチェーンの promise を返します。

より良いアプローチはありますか?

4

2 に答える 2

4

オブジェクトはPromiseオブジェクトと同じではありませんDeferred。オブジェクトを呼び出すpromise()Deferred、新しいPromiseオブジェクトが作成されます。Deferred関数をオブジェクトに追加したため、 Promise. Promiseしたがって、それらをオブジェクト自体に追加する必要があります。

あなたの$.extend電話では、まさにそれを行います。ただし、あなたが言うように、構文は少し難しいです。したがって、上記の単純な構文を使用できます。

foo = $.Deferred().promise(); // store the promise object

foo.a_method = function() { // add the property to the Promise object
    // do something only if "this" is resolved or rejected
    // throw an exception instead
};

return foo; // return the Promise object
于 2013-06-26T15:27:46.930 に答える
2

もっと良い方法があります。

Deferred.promise([target])のjQueryドキュメントは次のように述べています:

ターゲットが指定さdeferred.promise()れている場合、メソッドをそれにアタッチしてから、新しいオブジェクトを作成するのではなく、このオブジェクトを返します。これは、Promise 動作を既存のオブジェクトにアタッチするのに役立ちます。

したがって、次のように独自の promise メソッドを定義できます。

var myPromiseMethods = {
    myMethod1: function() {
        ...
    },
    myMethod2: function() {
        ...
    },
    myMethod3: function() {
        ...
    }
};

次に、次のようにメソッドを使用可能にすることができます。

var dfrd = $.Deferred();
...
return dfrd.promise(myPromiseMethods).myMethod();

一般に、メソッドは次のように記述します。

myMethod1: function() {
    var promise = this;
    //do something awesome here 
    return promise;
}

thisまたはを返すことによりpromise、メソッドは組み込みの Promise メソッドのように連鎖可能になります。

var dfrd = $.Deferred();
...
return dfrd.promise(myPromiseMethods).myMethod().then(...);

カスタム メソッドを含むオブジェクトは、任意の便利なスコープで定義できます。この例では、オブジェクトに名前を付けるだけですé(Windows では altGreen-E)。これはコンパクトで特徴的で、他の目的には使用されそうにありません。

それでは、promise の意味を逆にするメソッドを定義しましょうinvert()。解決は拒否になり、拒否は解決になります。

var é = {
    invert: function() {
        var promise = this;
        return $.Deferred(function(dfrd) {
            promise.then(dfrd.reject, dfrd.resolve);
        }).promise();
    }
};

var dfrd = $.Deferred();
dfrd.promise(é).invert().done(function(str) {
    alert('done: ' + str);
}).fail(function(str) {
    alert('fail: ' + str);
});
dfrd.reject('*');

ご覧のとおり、 で定義されたメソッドは、 でé作成されたすべての promise で使用できるようになりますdfrd.promise(é)

デモ

于 2014-04-18T21:39:36.193 に答える