4

オブジェクトを変数に保存し、その変数で1つ以上の遅延メソッドを呼び出してチェーンしようとするときと、遅延オブジェクトを直接チェーンしようとすると、異なる動作が得られる理由を理解したいと思っています。

オブジェクトを変数に保存する場合、各関数に送信される値は同じです (以下のコード スニペットの場合は 5)。つまり、この場合、値はフィルタリングされません。Deferred.pipe()直接連鎖すると、値はフィルター処理されます...そのため、いくつかの異なるステートメントでa を設定するときに get フィルター処理がどのように行われるかはわかりません。そして、jquery docsを読むことで、それが可能になるはずです:

Deferred オブジェクトは、jQuery オブジェクトがチェーン可能であるのと同様にチェーン可能ですが、独自のメソッドがあります。Deferred オブジェクトを作成した後、オブジェクトの作成から直接チェーンするか、オブジェクトを変数に保存し、その変数で 1 つ以上のメソッドを呼び出すことにより、以下のメソッドのいずれかを使用できます。

私は何を間違っていますか?

これが私のコードです:

<script type="text/javascript">
$(document).ready(function () {
// This works as expected - alert(20)

var defer = new $.Deferred();
defer.pipe(myFunction).pipe(myFunction).pipe(myAlert);
defer.resolve(5);

// This does not work as expected - alert(5)
var defer2 = new $.Deferred();
defer2.pipe(myFunction);
defer2.pipe(myFunction);
defer2.pipe(myAlert);
defer2.resolve(5);

});

var myFunction = function (value) {
return value * 2;
}

var myAlert = function (value) {
alert('The value is ' + value);
}
</script>
4

2 に答える 2

3

The $.Deferred object is indeed chainable, but in your second scenario, you are not chaining anything; you are just assigning multiple pipes to the $.Deferred object to be executed independently, when the $.Deferred is either resolved or rejected. In other words, you are ignoring the returned Promise object which contains the filtered/modified value to be passed to the next .pipe() in the chain.

From the docs:

The deferred.pipe() method returns a new promise that filters the status and values of a deferred through a function.

To achieve what you want in your second example, pipe the resulting Promise instead of the original $.Deferred object:

var defer2 = new $.Deferred();
var promise = defer2.pipe(myFunction);
promise = promise.pipe(myFunction); // pipe and update promise
promise.pipe(myAlert);
defer2.resolve(5);

DEMO.

于 2012-09-19T00:33:05.967 に答える
-1

Joao、私は同じケースを持っていました-呼び出されるパイプの番号が不明です。これがその方法です-JavaScriptのサイクルの非同期

于 2012-09-28T17:35:44.683 に答える