2012-04-20 10 views
18

मैं jQuery में स्थगित और वादे के बारे में पढ़ रहा हूं लेकिन मैंने अभी तक इसका उपयोग नहीं किया है।Deferred.pipe को समझना()

मैंने सबकुछ बहुत अच्छी तरह से समझ लिया है लेकिन विधि पाइप। मैं वास्तव में यह नहीं मिला कि यह क्या है।

कुछ कृपया मुझे यह समझने में मदद कर सकते हैं कि यह क्या करता है और इसका उपयोग कहां किया जा सकता है?

मुझे पता है कि इस तरह एक प्रश्न है (here) लेकिन यह वही नहीं है। मैं इसे समझने में मदद के लिए पूछ रहा हूं और कुछ उदाहरण। दूसरे प्रश्न का उद्देश्य यह है कि यह किसी विशेष मामले में क्यों काम नहीं करता है।

+1

क्या आपने http://api.jquery.com/deferred.pipe/ चेक किया है? – Armatus

+1

हाँ मेरे पास है। मैंने वहां से शुरू किया। – Diego

+0

ध्यान दें कि 'deferred.pipe' और' deferred.when' v1.8 के बराबर हैं (देखें http://stackoverflow.com/questions/12011925/pipe-and-then-documentation-vs-reality-in-jquery- 1-8) – tokland

उत्तर

46

असल में, Deferred.pipe()$.map() के बराबर एक असीमित है। यह इनपुट के रूप में प्रदान किए गए अन्य मूल्यों से नए मूल्यों को प्रोजेक्ट करता है, लेकिन इसका उद्देश्य निरंतरता के साथ उपयोग किया जाना है।

चलो एक उदाहरण के साथ शुरू करें जो केवल $.each() की आवश्यकता है और एक AJAX अनुरोध जारी करता है जो एक साधारण वस्तु देता है। इस ऑब्जेक्ट की प्रत्येक प्रॉपर्टी के लिए, हम फॉर्म नियंत्रण चाहते हैं जिसका id विशेषता संपत्ति के मूल्य पर अपना मूल्य निर्धारित करने के लिए संपत्ति की कुंजी है।हम कुछ लिख सकते हैं जैसे:

$.ajax("your/url", { 
    dataType: "json" 
}).done(function(data) { 
    $.each(data, function(key, value) { 
     $("#" + key).val(value); 
    }); 
}); 

अब मान लें कि हम फॉर्म नियंत्रण को अपडेट करने से पहले मूल्यों पर कुछ फ़ंक्शन लागू करना चाहते हैं। हम चाहते हैं कि स्थानीय स्तर पर, हम केवल लिखने के लिए क्या है, तो:

$.ajax("your/url", { 
    dataType: "json" 
}).done(function(data) { 
    $.each(data, function(key, value) { 
     // doSomethingWith() projects values synchronously, as map() does. 
     $("#" + key).val(doSomethingWith(value)); 
    }); 
}); 

लेकिन क्या होता doSomethingWith() कार्यान्वित करता है, तो है नहीं क्लाइंट साइड, लेकिन किसी अन्य वेब सेवा के माध्यम से सर्वर साइड? उस स्थिति में, हम दूसरे AJAX अनुरोध में नियंत्रण प्रवाह को श्रृंखलाबद्ध करना चाहते हैं, और दूसरा अनुरोध लौटाए जाने पर केवल फॉर्म नियंत्रण अपडेट करें।

$.ajax("your/url", { 
    dataType: "json" 
}).pipe(function(theOriginalData) { 
    return $.ajax("your/web/service/doSomethingWith", { 
     data: theOriginalData, 
     dataType: "json" 
    }); 
}).done(function(theFinalData) { 
    $.each(theFinalData, function(key, value) { 
     $("#" + key).val(value); 
    }); 
}); 
+2

महान उत्तर !! धन्यवाद! – Diego

+0

क्या ये 2 उदाहरण वास्तव में समान रूप से समान हैं? यह धारणा है कि एनन फ़ंक्शन जो '.pipe' कॉल के अंदर webservice को कॉल करता है, * iteratively *, मेरे लिए नया है। मुझे पता है कि jQuery 1.8 के रूप में, '.pipe' विधि को बहिष्कृत किया गया है और '.then' द्वारा प्रतिस्थापित किया गया है, लेकिन क्या आप मौजूद हैं, यदि आप' .each' और '.pipe' संस्करण के बीच कार्यात्मक अंतरों को विस्तृत कर सकते हैं? 'जीपी' द्वारा गणना किए गए पहले जीईटी से रिटर्न डेटा कैसा है? यदि ऐसा नहीं है कि यह कैसे काम करता है, तो मुझे लगता है कि यह स्पष्ट करना उपयोगी होगा कि 'websp' संस्करण एक webservice को कॉल करने के लिए बैच प्रक्रिया के रूप में काम करता है, न कि इसे। – JoeBrockhaus

+0

@ जो, उदाहरण "कार्यात्मक रूप से" समान हैं, केवल पहला ही मूल्यों को समकालिक रूप से संसाधित करता है, जबकि दूसरा व्यक्ति असीमित रूप से (एक वेब सेवा के माध्यम से) करता है। 'पाइप()' (और अब 'फिर()') केवल तभी कॉल किया जाता है जब पहला अनुरोध वापस आ गया है, इसलिए मूल डेटा पहले से ही उपलब्ध है। कोड * दिखता है * पुनरावृत्ति, लेकिन 'वाइप') एक वादा वापस करने का मतलब है कि बाकी पाइपलाइन उस वादे को पूरा करने के लिए इंतजार कर रही है (या अस्वीकार)। –

1

हिया यह है आप :)

[अच्छा पढ़ने] http://www.bennadel.com/blog/2255-Using-jQuery-s-Pipe-Method-To-Change-Deferred-Resolution.htm

बोली

पाइप() विधि दोनों सफलता के लिए एक फिल्टर प्रदान करता है और क्या ढूंढ रहे हैं विफलता संकल्प (AJAX अनुरोध का)। यदि मूल संकल्प सफलता है, तो पाइप() फ़िल्टर या तो वास्तव में सफल प्रतिक्रिया से गुजरता है; या, यह संकल्प बदलता है, एक नया खारिज कर दिया वादा। तो फिर, अगर मूल अनुरोध एक विफलता है, जो सही मायने में हमारे एपीआई में अप्रत्याशित होता था, पाइप() फिल्टर बस एक सामान्यीकृत एपीआई प्रतिक्रिया संरचना से होकर गुजरता है .... उदाहरण साथ

ढेर लिंक Understanding jQuery Deferred.pipe() (इसमें jsfiddle है)

परिभाषित & वादा को समझना? कृपया यहाँhttp://joseoncode.com/2011/09/26/a-walkthrough-jquery-deferred-and-promise/

Jquery आधिकारिक API पृष्ठhttp://api.jquery.com/deferred.pipe/ (उदाहरण के साथ) को देखने के

विवरण: फिल्टर करने के लिए उपयोगिता विधि और/या श्रृंखला Deferreds।

deferred.pipe() विधि एक नया वादा देता है जो फ़ंक्शन के माध्यम से स्थगित की स्थिति और मान फ़िल्टर करता है। किया गया फ़िल्टर और विफलफिल्टर फ़ंक्शन मूल स्थगित किए गए/ अस्वीकृत स्थिति और मान फ़िल्टर करते हैं। JQuery 1.7 के रूप में, विधि को भी स्थगित की अधिसूचना या अधिसूचनाओं के अनुसार किसी भी कॉल को फ़िल्टर करने के लिए प्रगति फ़िल्टर फ़ंक्शन को स्वीकार करती है।

11

ठीक है, मैं संदर्भ सामग्री का एक बहुत एक और जवाब में यहाँ देखते हैं, लेकिन पढ़ने कभी कभी समझ के समान नहीं है: Deferred.pipe() आसान है कि बनाता है।

मुझे वादा() के लिए बनाम .pipe() के लिए वादा() के आवेदन और एप्लिकेशन के बारे में सोचना सबसे आसान लगता है। प्रत्येक एक अलग तरीके से कार्य करता है। अगर मैं वचन.done (फ़ंक्शन (परिणाम) {...}) लेता हूं तो उसके बाद मैं .done() या .fail() के बाद अधिक से निपट सकता हूं क्योंकि प्रत्येक कॉल .done() या .fail () वही वही वादा देता है। इसलिए प्रत्येक कार्य मूल वादे से बंधेगा और क्या इसे हल या अस्वीकार कर दिया जाएगा।

अब, .pipe() के विपरीत। अगर मैं वादा करता हूं। पाइप (फ़ंक्शन (परिणाम) {...}) तो .pipe() से क्या आता है, यह एक नया वादा है! अगर मैं उस वचन के लिए .done() या .fail() संलग्न करता हूं तो उन कार्यों को परिणामों के संशोधित संस्करण मिलेगा जो .pipe() लौटाते हैं, मूल परिणाम नहीं।

तो .pipe() मेरे अनुभव में, शायद ही कभी आवश्यक है। एकमात्र समय यह वास्तव में काम में आता है यदि आपको किसी अन्य वचन को देखने से पहले किसी वचन से वापस आने वाले डेटा को संशोधित करने की आवश्यकता है (उदाहरण के लिए, किसी अन्य क्लाइंट साइड कोड के साथ काम करने से पहले क्लाइंट पक्ष पर AJAX कॉल के कुछ परिणामों को संशोधित करना यह) या यदि आपको चीजों को अनुक्रमित करने की आवश्यकता है। उदाहरण के लिए, वादे के बाद हल या अस्वीकार करने के बाद, एक और कार्रवाई करें, और फिर जब यह किया जाता है तो हम चाहते हैं कि अन्य कोड अंततः ट्रिगर करें। अन्य सभी कोड वाइप बी से जुड़ा हुआ है जो .pipe() कॉल से आया था।

यहां एक हालिया प्रश्न है जहां किसी अन्य उपयोगकर्ता को वादे के उपयोग में समस्याएं थीं और .pipe() /। Done() /। जब() और मैंने jsFiddle में प्रत्येक के उपयोग को स्पष्ट करने के लिए कुछ कोड प्रदान करने का प्रयास किया : Do something when all deferreds are resolved

+1

ग्रेट उत्तर, बिल्कुल मैं क्या था टी कोशिश कर रहा हूँ o wrt को समझें क्यों .done() के बजाय .pipe() का उपयोग करें। – uglymunky

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