7

私はまだJQueryのDeferredオブジェクトを使用して頭を包み込もうとしており、1つの特定の問題で頭を悩ませています。次のコードでは、最初にチェーンを試みましdeferred.then()たが、機能しませんでした。3つの機能すべてが同時に実行されます。同僚が私にそのpipe機能を指摘して初めて、物事はうまくいきました。問題は、なぜ機能するのに機能しpipe()ないのthen()かということです。

var otherDefer = function(msg){return function(){return testDefer(msg)}};
var there = otherDefer("there,");
var guy = otherDefer("guy.");                       

function testDefer(msg) {
    var deferred = $.Deferred();
    pretendAjaxCall( function() {
        $('<li>'+msg+'</li>').appendTo('#msgOut');
        deferred.resolve();
    });
    return deferred.promise();  
}

function pretendAjaxCall(callback) {
    setTimeout(callback,1500);
} 

$.when(testDefer("Hi")).pipe(there).then(guy);​

return deferredの代わりreturn deferred.promise()に使ってみwhen().then().then()ました。

上記のコードのjsFiddle:http: //jsfiddle.net/eterpstra/yGu2d/

4

3 に答える 3

6

jQuery 1.8以降、then()は、when()が返すのと同じDeferredではなく、新しいPromise(pipe()と同じ)を返します。

次の例で、jQueryのバージョンを1.8.3以降に変更します。

http://jsfiddle.net/eterpstra/yGu2d

$.when(testDefer("Hi")).then(there).then(guy);

動作します。

于 2013-07-12T18:32:57.567 に答える
5

これがサンプルでの動作方法ですthen()pipe()

then()Deferredを返しthen()、これと同じ Deferredを呼び出すことで、最初のコールバックと同時に呼び出される2番目のコールバックを追加するだけです。

pipe()代わりに、新しい Promiseを返し、チェーンを構築できるようにします。そのため、この場合は順次呼び出しを取得します。


pipe / thenの詳細については、次のリソースを参照してください。

jQueryのdeferredの「then」メソッドをいつ使用する必要がありますか?「pipe」メソッドをいつ使用する必要がありますか?

JavaScriptでの約束のパイプライン

于 2012-09-05T00:09:51.150 に答える
2

使用されるべきではない方法で使用しています。コールバックとして追加される単純な関数だけが.then期待される場合は、延期されていると主張しています。.then

この.thenメソッドは、すでに解決されている元のDeferredを返します。Deferredが解決されると、で追加されたすべてのコールバック.thenがすぐに実行されます。

一方、.pipe関数は一連の関数またはPromise(送信するもの)のいずれかを取り、元のDeferredのステータスに基づいて解決します。の機能.pipeは実際にあなたが探しているものです!

于 2012-09-05T00:07:12.513 に答える