मैं एक ऐसी ही उपयोग के मामले थी, इसलिए मुझे लगता है कि यह आप बाहर की मदद करनी चाहिए।
निम्न विधि विधियों की एक सरणी (जो वादा वापस कर सकती है या नहीं भी कर सकती है) ले जाएगी और अनुक्रम में निष्पादित करेगी, जब तक कि प्रत्येक स्थगित आगे बढ़ने से पहले पूरा न हो जाए। विफलता पर रोकना डिफ़ॉल्ट व्यवहार है; दूसरा तर्क आपको आगे बढ़ने देता है कि कॉल विफल रहता है या नहीं।
/असफल हैंडलर हस्ताक्षर (सरणी < संदर्भ>) समारोह (सरणी < वस्तु {अस्वीकार कर दिया | समाधान किया गया: तर्क}>) कर रहे हैं किया, जहां संदर्भ प्रत्येक resolveWith/rejectWith कॉल के संदर्भ है, या प्रश्न में स्थगित, और तर्क तर्क सेट है जो संकल्प/अस्वीकृति में पारित किया गया था।
(function ($) {
"use strict";
var copy = function (a) {
return Array.prototype.slice.call(a);
};
/**
Handle a sequence of methods, stopping on failure by default
@param Array<Function> chain List of methods to execute. Non-deferred return values will be treated as successful deferreds.
@param Boolean continueOnFailure Continue executing even if one of the returned deferreds fails.
@returns Deferred
*/
$.sequence = function (chain, continueOnFailure) {
var handleStep, handleResult,
steps = copy(chain),
def = new $.Deferred(),
defs = [],
results = [];
handleStep = function() {
if (!steps.length) {
def.resolveWith(defs, [ results ]);
return;
}
var step = steps.shift(),
result = step();
handleResult(
$.when(result).always(function() {
defs.push(this);
}).done(function() {
results.push({ resolved: copy(arguments) });
}).fail(function() {
results.push({ rejected: copy(arguments) });
})
);
};
handleResult = continueOnFailure ?
function (result) {
result.always(function() {
handleStep();
});
} :
function (result) {
result.done(handleStep)
.fail(function() {
def.rejectWith(defs, [ results ]);
});
};
handleStep();
return def.promise();
};
}(this.jQuery));
उपयोग की एक साधारण उदाहरण: http://jsfiddle.net/rG9rA/
function func1() {
var dfd = $.Deferred();
setTimeout(function() {
dfd.resolve('Password');
}, 1000);
return dfd.promise();
}
function func2(message) {
var dfd = $.Deferred();
setTimeout(function() {
if (message == 'Password') {
dfd.resolve('Hello World');
}
}, 1000);
return dfd.promise();
}
$.sequence([func1, func2, function() { alert('done'); }]);
मैं प्यार करता हूँ जब लोग इस तरह के संक्षिप्त रूप से चीजों को समझाने। समझने में आसान और – tim
का पालन करें नोट: '.then' का उपयोग करें क्योंकि .pipe' को jQuery 1.8 ([docs] (http://api.jquery.com/deferred.pipe/) में बहिष्कृत किया गया है) – nhylated