चूँकि jQuery 1.8 .then
समान व्यवहार करता है .pipe
:
पदावनति सूचना: jQuery 1.8 के रूप में, deferred.pipe()
विधि पदावनत है। deferred.then()
विधि है, जो इसे बदल देता है, बजाय प्रयोग किया जाना चाहिए।
तथा
JQuery 1.8 के रूप में , deferred.then()
विधि एक नया वादा लौटाती है जो एक फ़ंक्शन के माध्यम से आस्थगित की स्थिति और मूल्यों को फ़िल्टर कर सकती है, अब-पदावनत deferred.pipe()
विधि की जगह।
नीचे दिए गए उदाहरण अभी भी कुछ के लिए उपयोगी हो सकते हैं।
वे विभिन्न उद्देश्यों की पूर्ति करते हैं:
.then()
जब भी आप प्रक्रिया के परिणाम के साथ काम करना चाहते हैं, तो इसका उपयोग किया जाना चाहिए, जैसा कि प्रलेखन कहता है, जब आस्थगित वस्तु को हल या अस्वीकार कर दिया जाता है। यह उपयोग .done()
या के रूप में ही है .fail()
।
आप किसी भी तरह .pipe()
से (पूर्व) फ़िल्टर का उपयोग करेंगे । कॉलबैक के रिटर्न मान को कॉलबैक और कॉलबैक के .pipe()
तर्क के रूप में पारित किया जाएगा । यह एक और आस्थगित वस्तु भी लौटा सकता है और इस आस्थगित पर निम्नलिखित कॉलबैक पंजीकृत किए जाएंगे।done
fail
यही कारण है कि के साथ ऐसा नहीं है .then()
(या .done()
, .fail()
), पंजीकृत कॉलबैक की वापसी मान सिर्फ ध्यान नहीं दिया जाता।
तो ऐसा नहीं है कि आप या तो उपयोग करते हैं .then()
या .pipe()
। आप एक ही उद्देश्य के लिए उपयोग कर सकते हैं .pipe()
, .then()
लेकिन कांसेप्ट धारण नहीं करता है।
उदाहरण 1
कुछ ऑपरेशन का परिणाम वस्तुओं की एक सरणी है:
[{value: 2}, {value: 4}, {value: 6}]
और आप न्यूनतम और अधिकतम मानों की गणना करना चाहते हैं। मान लें कि हम दो done
कॉलबैक का उपयोग करते हैं :
deferred.then(function(result) {
// result = [{value: 2}, {value: 4}, {value: 6}]
var values = [];
for(var i = 0, len = result.length; i < len; i++) {
values.push(result[i].value);
}
var min = Math.min.apply(Math, values);
/* do something with "min" */
}).then(function(result) {
// result = [{value: 2}, {value: 4}, {value: 6}]
var values = [];
for(var i = 0, len = result.length; i < len; i++) {
values.push(result[i].value);
}
var max = Math.max.apply(Math, values);
/* do something with "max" */
});
दोनों मामलों में आपको सूची पर पुनरावृत्त करना होगा और प्रत्येक ऑब्जेक्ट से मान निकालना होगा।
क्या किसी तरह से पहले से मान निकालना बेहतर नहीं होगा ताकि आपको व्यक्तिगत रूप से दोनों कॉलबैक में ऐसा न करना पड़े? हाँ! और हम इसका उपयोग कर सकते हैं .pipe()
:
deferred.pipe(function(result) {
// result = [{value: 2}, {value: 4}, {value: 6}]
var values = [];
for(var i = 0, len = result.length; i < len; i++) {
values.push(result[i].value);
}
return values; // [2, 4, 6]
}).then(function(result) {
// result = [2, 4, 6]
var min = Math.min.apply(Math, result);
/* do something with "min" */
}).then(function(result) {
// result = [2, 4, 6]
var max = Math.max.apply(Math, result);
/* do something with "max" */
});
जाहिर है यह एक बना हुआ उदाहरण है और इस समस्या को हल करने के कई (शायद बेहतर) तरीके हैं, लेकिन मुझे उम्मीद है कि यह इस बिंदु को दिखाता है।
उदाहरण 2
अजाक्स कॉल पर विचार करें। कभी-कभी आप पिछले एक के पूरा होने के बाद एक अजाक्स कॉल शुरू करना चाहते हैं। एक तरीका done
कॉलबैक के अंदर दूसरा कॉल करना है :
$.ajax(...).done(function() {
// executed after first Ajax
$.ajax(...).done(function() {
// executed after second call
});
});
अब मान लेते हैं कि आप अपने कोड को अलग करना चाहते हैं और इन दो अजाक्स कॉलों को एक फंक्शन के अंदर रखना चाहते हैं:
function makeCalls() {
// here we return the return value of `$.ajax().done()`, which
// is the same deferred object as returned by `$.ajax()` alone
return $.ajax(...).done(function() {
// executed after first call
$.ajax(...).done(function() {
// executed after second call
});
});
}
आप अन्य कोड की अनुमति देने के लिए आस्थगित ऑब्जेक्ट का उपयोग करना चाहते हैं, जो दूसरे अजाक्स कॉल के makeCalls
लिए कॉलबैक संलग्न करने के लिए कॉल करता है, लेकिन
makeCalls().done(function() {
// this is executed after the first Ajax call
});
वांछित प्रभाव नहीं होगा क्योंकि दूसरी कॉल एक done
कॉलबैक के अंदर की जाती है और बाहर से सुलभ नहीं होती है।
समाधान .pipe()
इसके बजाय उपयोग करना होगा :
function makeCalls() {
// here we return the return value of `$.ajax().pipe()`, which is
// a new deferred/promise object and connected to the one returned
// by the callback passed to `pipe`
return $.ajax(...).pipe(function() {
// executed after first call
return $.ajax(...).done(function() {
// executed after second call
});
});
}
makeCalls().done(function() {
// this is executed after the second Ajax call
});
उपयोग करके .pipe()
अब आप कॉल के वास्तविक प्रवाह / क्रम को उजागर किए बिना कॉलबैक को "इनर" अजाक्स कॉल में जोड़ना संभव बना सकते हैं।
सामान्य तौर पर, आस्थगित ऑब्जेक्ट आपके कोड को डिकूप करने का एक दिलचस्प तरीका प्रदान करते हैं :)