2012-12-05 5 views
7

私が探しているものの最も単純な例はこれです:リユースjQuery.post()/ jQuery.Deferred()オブジェクト

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

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

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

私はそれを再開させてくれる遅延オブジェクトの呼び出しを見つけることができないようです。すなわちmessageLoader.redo()、理想的にはPOSTリクエストを再実行し、その後、私がそれを再定義する必要なく、同じ "done"ハンドラを呼び出します。

私は、関数でそれをすべて入れて、もう一度その関数を呼び出しますが、私はさらにこれをしたいと思うので、それは、私が探しているものではないのですができます

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データを使用します。

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

+0

目的のアクションを実行する関数を作成して、もう一度呼び出すことはできますか? –

答えて

4

Deferredクラスは、1回限りの使用オブジェクトを意図しているので、あなたが望むように動作するようには設計されていません。私はjQueryConfのDeferredsの全セッションで座っていても、それらを再利用することさえ言及されていませんでした。

さらに、あなたは繰延APIページから見ることができるように:

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

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

あなたは、あなたが「何かを行く、ちょっと延期」と言うことができるように設計された繰延(new Deferred().when(something))、その後、あなたが言うことができる(deferred.then(x))「をそれがXを行う行うの際ねえ、繰延」心に留めておく必要があります。さて、あなたは "それが終わったとき"と言うとき、すなわち。 .thenコールを行うと、Deferredはdoneまたはnotの2つの状態になりますが、どちらの場合でもコールは機能します(完了した場合はすぐに解決されます。そうでなければ、トリガーされるのを待ちます)。

Deferredが3番目の状態(「done but restarted」)を持つ場合、.thenコールは何をすべきか分からないでしょう:「完了しましたが再起動しました」とは、その答えは、再起動の前または後に電話をかけるかどうかによって異なります。また、複数の再起動が可能な場合は、すべてが複雑になる可能性があります。

jQueryの人々は、(どれも($.ajax)のために必要とされていなかった)すべてのものを扱うのではなく、(比較的単純な)現在のDeferredの実装に行きました。

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 
}) 
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();   
}); 

これは、他のデータを保持したまま使用すると、1つをリロードすることができます。

関連する問題