(अद्यतन:। कृपया ध्यान दें कि वर्तमान में jQuery वादे Promises/A+ specification साथ संगत नहीं हैं - this answer में अधिक जानकारी)
अपने समारोह में जहां AJAX अनुरोध बनाने के आप भी एक आस्थगित वस्तु बना सकते हैं और अपने संकल्प को बंधन के बाद फोन करने वाले के लिए एक वादा लौट सकते हैं और कुछ कस्टम डेटा सत्यापन के साथ $ .ajax अनुरोध की उचित कॉलबैक करने के लिए कार्यों को अस्वीकार कर देते हैं:
function makerequest() {
var deferred = $.Deferred();
var promise = deferred.promise();
var jqxhr = $.ajax({
// ...
});
jqxhr.success(function(data, status, xhr) {
if (!data || !data.success) {
deferred.reject(jqxhr, 'error');
} else {
deferred.resolve(data, status, xhr);
}
});
jqxhr.error(function(jqXHR, status, error) {
deferred.reject(jqXHR, status, error);
});
return promise;
}
अब किसी को भी हो सकता है
var request = makerequest();
request.done(successCallback);
request.fail(errorCallback);
या यहां तक कि बस: (
promise.success = promise.done;
promise.error = promise.fail;
तो अपने कॉलर होगा:
makerequest().then(successCallback, errorCallback);
आप भी जोड़ इस यदि आपके कार्य करने के लिए इस तरह के किसी भी वादा की तरह उपयोग करने में सक्षम शायद अधिक परिचित) .success के इंटरफेस() और शुद्ध $ .ajax साथ .त्रुटि() की तरह() कहता है:
var request = makerequest();
request.success(successCallback);
request.error(errorCallback);
(.complete() का कार्यान्वयन पाठक के लिए एक अभ्यास के रूप में छोड़ दिया गया है।
यहाँ एक और उदाहरण एक काम परियोजना से सीधे खींच लिया है::)
इस डेमो देखें
function ajax(url, data) {
var self = this;
var deferred = $.Deferred();
var promise = deferred.promise();
var jqxhr = $.ajax({
url: url,
data: JSON.stringify(data),
contentType: "application/json; charset=utf-8",
dataType: 'json',
type: 'POST'
}).done(function (msg, status, xhr) {
if (!msg || msg.Error) {
self.doError(msg.Error);
deferred.reject(jqxhr, 'error');
} else {
deferred.resolve(msg, status, xhr);
}
});
return promise;
}
** कृपया ध्यान दें **: यह उत्तर फरवरी '11 दिनांकित है, जिस समय jQuery jQuery v1.5 पर था। JQuery के बाद के सुधार इस जवाब को अनावश्यक बनाते हैं। V1.6 से, आम तौर पर स्वीकृत समाधान में 'deferred.pipe() 'और v1.8' deferred.then()' से शामिल होगा, जिस बिंदु पर हम 'function makerequest() {return jqxhr.then जैसे कुछ लिखेंगे। (फ़ंक्शन (डेटा) {वापसी (डेटा और डेटा.success)? jqxhr: $। डिफर्ड() अस्वीकार करें (नई त्रुटि ('AJAX डेटा त्रुटि'))। वादा();}); } '। –
जैसे ही हम कुछ वापस लौटना शुरू करते हैं, 'jqXHR' के बराबर नहीं है (जैसे '$। डिफर्ड()। ऊपर दिए गए उत्तर में वादा'), हम मूल' jqXHR' ऑब्जेक्ट के '.abort()' फ़ंक्शन तक पहुंच को खो देते हैं और कर सकते हैं यदि आवश्यक हो, तो इसे हल करने से पहले अनुरोध को रद्द न करें। –