@Bergi के रूप में कहते हैं jQuery Deferreds/वादे मूलरूप विरासत से लचीला नहीं हैं।
इसके बजाय, मॉडल jQuery द्वारा अपनाया व्यक्ति वादा उदाहरणों वाक्य रचना के साथ बढ़ाया जा करने के लिए अनुमति देने के लिए है:
deferred.promise(target);
//or,
promise.promise(target); //(though the documentation doesn't make this clear)
// where `target` is an "object onto which the promise methods have to be attached"
// see https://api.jquery.com/deferred.promise/
तरीकों में से एक समूह के साथ एक निर्माता को परिभाषित करके, किसी भी jQuery स्थगित या वादा के साथ बढ़ाया जा सकता है सरल वाक्य रचना
.promise(Constructor())
मेरी अप्रकाशित में, undocumented jQuery का वादा किया खेल का मैदान, निर्माता $P
नाम पर है और jQuery नाम स्थान में रखा है, इसलिए वास्तविक वाक्य रचना मैं का उपयोग करें:
.promise($.$P())
आपको लगता है कि के बारे में पता करने की आवश्यकता है, अधिकांश भाग के लिए, यह स्पष्ट रूप से $.$P()
कॉल करने के लिए के रूप में खेल का मैदान एक $.when_()
विधि है कि एक पहले से ही बढ़ा वादा रिटर्न भी शामिल है आवश्यक नहीं है।
यहाँ एक .delay()
विधि प्रदान करने के लिए पर्याप्त के साथ खेल का मैदान के एक संक्षिप्त संस्करण है:
(function($) {
/* ***********************************
* The $.$P function returns an object
* designed to be extended with
* promise methods using the syntax :
* myDeferred.promise($.$P())
* myPromise.promise($.$P())
* where `myDeferred`/`myPromise`
* are jQuery Deferred/Promise objects.
* ***********************************/
/* ***********************************
* Methods
* ***********************************/
$.$P = function() {
if (this instanceof $.$P) {
return this;
} else {
return new $.$P();
}
};
$.$P.prototype.then_ = function(fa, fb) {
/* A promise method that is the same as .then()
* but makes these extra methods available
* down-chain.
*/
return this.then(fa||null, fb||null).promise($.$P());
}
$.$P.prototype.delay_ = function(ms) {
/* A promise method that
* introduces a down-chain delay.
*/
var promise = this;
function f(method) {
return function() { setTimeout(function(){ method.apply(null,this); }.bind(arguments), ms||0); };
}
return $.Deferred(function(dfrd) {
promise.then(f(dfrd.resolve), f(dfrd.reject));
}).promise($.$P());
}
/* ***********************************
* Utility functions
* ***********************************/
function consolidate(args) {
/* Convert mixed promises/arrays_of_promises to single array.
* Called by all the when_() methods below.
*/
return Array.prototype.slice.apply(args).reduce(function(arr, current) {
return arr.concat(current);
}, []);
}
/* ***********************************
* This section extends the jQuery namespace
* with a "jQuery.when_()" method.
* ***********************************
*/
$.extend({
'when_': function() {
return $.when.apply(null, consolidate(arguments)).promise($.$P()).then_(function() {
return consolidate(arguments);
});
},
});
})(jQuery);
पूरा खेल का मैदान भी एक पूरी गुच्छा अधिक स्थिर और अन्य प्रयोजनों के लिए वादा-उदाहरण के तरीके शामिल हैं, और उन्हें विकसित करने नाटक का सार है।
- सभी खेल का मैदान के स्थिर और वादा तरीकों "_" अंडरस्कोर में खत्म हो: प्लेग्राउंड प्रयोग करने के लिए
जमीन नियम इस प्रकार हैं।
- स्टेटिक विधियां, उदाहरण के लिए
$.when_()
, Playgound इंस्टॉल करके उपलब्ध कराई गई हैं। - एक वादे श्रृंखला में वादे एक स्थैतिक विधि, जैसे
.when_()
, या चेनिंग .promise($.$P())
सहित बढ़ाया जाता है। - एक वादे श्रृंखला में, एक्सटेंशन
.then()
के स्थान पर .then_()
मानक विधियों के बजाय "..._" विधियों का उपयोग करके उपलब्ध हैं (श्रृंखला के नीचे)।
तो यहाँ है कि यह कैसे उपयोग करने के लिए प्रश्न के लिए आवश्यक देरी लागू करने के लिए है:
jQuery(function($) {
var MYNAMESPACE = {
run: function (t) {
return $.when_()
.then_(function() {
log("call together");
log("call together");
})
.delay_(t)
.then_(function() {
log("call first");
})
.delay_(t)
.then_(function() {
log("call second");
});
}
}
});
DEMO
डेमो में, बटन के क्लिक हैंडलर कैसे खेल का मैदान के आगे संकेत देता है इस्तेमाल किया जा सकता है। खेल का मैदान के प्रयोग पर
प्रावधानों:
- मैं कहता हूँ के रूप में - यह एक खेल का मैदान है।
- jQuery के लिए एडाप्टर के रूप में, पैच नहीं, यह स्थानों में बेहद अक्षम है। सबसे खराब पहलू यह है कि कुछ विधियां एक लौटने के अलावा मध्यवर्ती वादा करती हैं।
- उत्पादन कोड में उपयोग के लिए आवश्यक मानकों का परीक्षण नहीं किया गया है, इसलिए सावधानी के साथ उपयोग करें।
और आखिरकार, उपर्युक्त पर विचार करें यदि आप jQuery के साथ देरी को लागू करने के लिए निर्धारित हैं। एक वचन lib का उपयोग करने के लिए यह बहुत आसान है कि पहले से ही .delay()
विधि है।
@ guest271314: मैं वास्तव में वादों के लिए समारोह की जरूरत है। प्रभाव के लिए यह समारोह। – user348173
संभावित डुप्लिकेट [क्या JQuery के वादे ऑब्जेक्ट में विधियों को जोड़ना संभव है?] (Http://stackoverflow.com/q/30719454/1048572) (केवल '.catch' के बजाय '.delay' विधि जोड़ें) – Bergi
@ jfriend00: बिलकुल ठीक है [यह संभव है] (http://stackoverflow.com/a/30719727/1048572) ... लेकिन प्रोटोटाइप को विस्तारित करने के रूप में आसानी से नहीं है। – Bergi