2012-12-05 11 views
7

मैं क्या तलाश कर रहा हूँ यह है की सबसे सरल उदाहरण:पुन: उपयोग jQuery.post()/jQuery.Deferred() वस्तु

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

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

यह शानदार ढंग से काम करता है, लेकिन केवल एक बार। अगर मैं डेटा अपडेट करना चाहता हूं, तो मुझे सबकुछ फिर से परिभाषित करना होगा।

मुझे डिफरर्ड ऑब्जेक्ट के लिए कोई कॉल नहीं मिल रहा है जो मुझे इसे पुनरारंभ करने दें। यानी 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 डेटा का उपयोग करेगा।

मैंने इस तरह के कुछ के लिए दस्तावेज़ों में देखा है लेकिन कुछ भी नहीं मिला है। शायद यहां कोई जानता है कि यह मौजूद है या एक ही चीज़ को पूरा करने का एक तरीका है।

+0

बस एक ऐसा फ़ंक्शन बनाएं जो आपके इच्छित कार्यों को करता है, और इसे फिर से कॉल करें? –

उत्तर

4

मुझे पूरा यकीन है कि डिफरर्ड क्लास सिर्फ आपके इच्छित तरीके से काम करने के लिए डिज़ाइन नहीं किया गया है, क्योंकि वे एक बार उपयोग ऑब्जेक्ट्स बनने का इरादा रखते हैं। मैं भी jQueryConf पर Deferreds पर एक पूरे सत्र में बैठ गया, और फिर से उनका उपयोग भी उल्लेख नहीं किया गया था।

इसके अलावा, आप आस्थगित API पृष्ठ से देख सकते हैं के रूप में:

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

कोई पुनः आरंभ करने की विधि है। आप हो सकता है कि इसे "पुनरारंभ" करने के अनुकरण के लिए मैन्युअल रूप से किसी डिफरर्ड के गुणों को मैन्युअल रूप से परिवर्तित करने में सक्षम हो, लेकिन वास्तव में मुझे लगता है कि आपको इस बिंदु पर अपनी कक्षा बनाना चाहिए, क्योंकि आप वास्तव में कुछ की पेशकश नहीं कर रहे हैं।

आप स्थगित बनाया गया है ताकि आप कह सकते हैं "हे स्थगित, कुछ करना जाना" (new Deferred().when(something)), और फिर आप कह सकते हैं "अरे, स्थगित यह काम होने पर कर एक्स" (deferred.then(x)) को ध्यान में रखना है। अब, जब आप कहते हैं "जब यह किया जाता है", यानी। जब आप .then कॉल करते हैं, तो डिफरर्ड दो राज्यों में हो सकता है: किया गया, या नहीं, लेकिन कॉल किसी भी मामले में काम करता है (यदि यह किया जाता है तो यह तुरंत हल हो जाता है, अन्यथा यह ट्रिगर होने की प्रतीक्षा करता है)।

अब, यदि एक डिफरर्ड में तीसरा राज्य हो सकता है ("किया गया लेकिन फिर से शुरू किया गया"), .then कॉल नहीं जानता कि क्या करना है: क्या "किया लेकिन फिर से शुरू किया गया" का अर्थ है कि इसे इसके बाद आग लगनी चाहिए, या नहीं? उत्तर इस बात पर निर्भर करता है कि आपने रीस्टार्ट कॉल से पहले या बाद में .then कॉल किया था, और जैसा कि आप उम्मीद कर रहे हैं कि सभी को जटिल होने की संभावना है (विशेष रूप से यदि आप एकाधिक पुनरारंभ करने की अनुमति देते हैं)।

उन सभी के साथ सौदा करने के बजाय (जिनमें से कोई भी $.ajax के लिए आवश्यक नहीं था) jQuery लोगों को (तुलनात्मक रूप से सरल) वर्तमान डिफर्ड कार्यान्वयन के साथ चला गया, और मुझे लगता है कि यह उनके हिस्से पर सही कॉल था।

0

यह एक कार्य बनाने और इसे याद करने के समान सरल है। $ .post को जीवित रखना संभव नहीं है क्योंकि http एक स्थिर प्रोटोकॉल है।

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

यह जबकि अन्य से डेटा रखने आप एक फिर से लोड करने की अनुमति देगा।

संबंधित मुद्दे