7

私が探しているものの最も簡単な例はこれです:

var messageLoader = $.post("api/user/messages", {api:data})

messageLoader.done(function(data){
   //do something 
});

これは見事に機能しますが、一度だけです。データを更新したい場合は、すべてを再定義する必要があります。

Deferred Object を再起動させるための呼び出しが見つからないようです。つまりmessageLoader.redo()、理想的には POST リクエストをやり直し、その後、再定義することなく同じ「完了」ハンドラを呼び出します。

すべてを関数に入れて、その関数をもう一度呼び出すこともできますが、それは私が探しているものではありません。

var messageLoader = $.post("api/user/messages", {api:data})
var friendRequestLoader = $.post("api/user/friendrequests", {api:data})

$.when(messagesLoader, friendRequestLoader)
    .done(function (messages, friendRequests) {
        // update display of messages and friend requests
        // attach Handlers
    });

$("#updateMessages").click(function(){
    messageLoader.redo() // This doesn't exist
})

クリック$("#updateMessages")するとその要求だけがやり直され、$.when()ハンドラーは新しいmessageLoaderデータと元のfriendRequestLoaderデータを使用するという考え方です。

ドキュメントでこのようなものを探しましたが、何も見つかりませんでした。おそらく、ここにいる誰かがそれが存在するかどうか、または同じことを達成する方法を知っているでしょう。

4

3 に答える 3

4

Deferred クラスは、一度だけ使用するオブジェクトであることを意図しているため、意図したとおりに動作するように設計されていないことは確かです。jQueryConf での Deferred に関するセッション全体に参加したこともありましたが、それらの再利用については触れられていませんでした。

さらに、Deferred API ページからわかるように:

http://api.jquery.com/category/deferred-object/

再起動方法はありません。Deferred のプロパティを手動で変更して「再起動」をシミュレートできるかもしれませんが、Deferred が提供しないものを本当に探しているので、この時点で独自のクラスを作成する必要があると思います。

心に留めておく必要があるのは、Deferred は、「Hey Deferred、何かを実行してください」( new Deferred().when(something)) と言うことができるように設計されていることですdeferred.then(x)。さて、「それが終わったら」と言うと、つまり。呼び出しを行う.thenと、Deferred は完了または未完了の 2 つの状態になりますが、呼び出しはどちらの場合でも機能します (完了した場合はすぐに解決し、それ以外の場合はトリガーされるのを待ちます)。

ここで、Deferred が 3 番目の状態 (「完了したが再開されました」) を持つ可能性がある場合、.then呼び出しは何をすべきかわかりません。.then答えは、再起動呼び出しの前または後のどちらで呼び出しを行ったかによって異なります。うまくいけば、すべてがかなり複雑になる可能性があることがわかります (特に複数の再起動を許可する場合)。

$.ajaxjQuery 関係者は、そのすべてに対処するのではなく (いずれも必要ではありませんでした)、(比較的単純な) 現在の Deferred 実装を使用しました。これは、彼らにとって正しい選択だったと思います。

于 2012-12-05T21:51:42.113 に答える
0

この方法を試すことができます:

function Defer() {
    $.when(messageLoader, friendRequestLoader)
        .done(function (messages, friendRequests) {
            console.log("M : " + messages[0].test);   
            console.log("F : " + friendRequests[0].test);  
        });
}
$("#updateMessages").click(function(){
    messageLoader = $.post("api/user/messages", {api:data});
    Defer();          
});

これにより、一方のデータを保持しながら一方をリロードできます。

于 2012-12-05T22:17:18.757 に答える
0

関数を作成してそれを呼び出すのと同じくらい簡単です。http は静的プロトコルであるため、$.post を存続させることはできません。

var messageLoader;
var friendRequestLoader;
updateMessages();

function updateMessages(){
 messageLoader= $.post("api/user/messages", {api:data})
 friendRequestLoader = $.post("api/user/friendrequests", {api:data})
}

$.when(messagesLoader, friendRequestLoader)
    .done(function (messages, friendRequests) {
        // update display of messages and friend requests
        // attach Handlers
    });

$("#updateMessages").click(function(){
    updateMessages(); // This doesn't exist
})
于 2012-12-05T22:13:19.707 に答える