jQuery के स्थगित और वादे - .then () बनाम .done ()


473

मैं jQuery के विरोधाभासों और वादों के बारे में पढ़ रहा हूं और मैं सफल कॉलबैक के उपयोग .then()और अंतर के बीच अंतर नहीं देख सकता .done()। मुझे पता है कि एरिक हेंड्स का उल्लेख है .done()और .success()उसी कार्यक्षमता के लिए मैप किया गया है, लेकिन मैं अनुमान लगा रहा हूं .then()कि सभी कॉलबैक एक सफल ऑपरेशन के पूरा होने पर लागू किए जाते हैं।

किसी को भी सही उपयोग के लिए मुझे बता सकते हैं?


15
कृपया ध्यान दें कि जून 2016 में जारी JQuery 3.0 पहला संस्करण था जो प्रोमिस / A + और ES2015 प्रोमेक कल्पना के अनुरूप था। इससे पहले के कार्यान्वयन में असंगतता थी कि क्या वादे करने थे।
फ्लिम्स

कब क्या उपयोग करना है, के लिए एक बेहतर सिफारिश के साथ मैंने अपना उत्तर अपडेट किया ।
राबर्ट सीमर

जवाबों:


577

done()स्थगित किए गए कॉलबैक को निकाल दिया जाएगा जब स्थगित समाधान हो जाएगा। fail()आस्थगित अस्वीकार किए जाने पर संलग्न कॉलबैक निकाल दिए जाएंगे।

JQuery 1.8 से पहले, then()बस वाक्यात्मक चीनी थी:

promise.then( doneCallback, failCallback )
// was equivalent to
promise.done( doneCallback ).fail( failCallback )

1.8 के रूप में, then()के लिए एक उपनाम है pipe()और एक नया वादा, देखने देता है यहाँ बारे में अधिक जानकारी के लिए pipe()

success()और error()केवल jqXHRएक कॉल द्वारा लौटाए गए ऑब्जेक्ट पर उपलब्ध हैं ajax()। वे क्रमशः done()और के लिए साधारण उपनाम fail()हैं:

jqXHR.done === jqXHR.success
jqXHR.fail === jqXHR.error

इसके अलावा, done()एक कॉलबैक तक सीमित नहीं है और गैर-कार्यों को फ़िल्टर करेगा (हालांकि संस्करण 1.8 में तार के साथ एक बग है जिसे 1.8.1 में तय किया जाना चाहिए):

// this will add fn1 to 7 to the deferred's internal callback list
// (true, 56 and "omg" will be ignored)
promise.done( fn1, fn2, true, [ fn3, [ fn4, 56, fn5 ], "omg", fn6 ], fn7 );

उसी के लिए जाता है fail()


8
thenएक नया वादा लौटाना एक महत्वपूर्ण बात थी जो मुझे याद आ रही थी। मुझे समझ नहीं आ रहा $.get(....).done(function(data1) { return $.get(...) }).done(function(data2) { ... })था कि data2अपरिभाषित के साथ एक श्रृंखला क्यों असफल हो रही थी ; जब मैं बदल doneकरने के लिए thenयह काम किया, क्योंकि मैं वास्तव में पाइप वादों के लिए इच्छुक था एक साथ के बजाय मूल वादा करने के लिए और अधिक संचालकों देते हैं।
१46:४६ पर मारसैनिडर

5
jQuery 3.0 पहला संस्करण है जो वादे / A + और ES2015 कल्पना के अनुरूप है।
फ्लिम्स

4
मुझे अभी भी समझ नहीं आया कि मैं एक का दूसरे पर प्रयोग क्यों करूँगा। अगर मैं एक अजाक्स कॉल करता हूं और मुझे उस कॉल को पूरी तरह से पूरा होने तक इंतजार करने की आवश्यकता है (मतलब रिपॉजिट सर्वर से वापस आ गया है) इससे पहले कि मैं एक और अजाक्स कॉल करता हूं, क्या मैं उपयोग करता हूं doneया then? क्यों?
कोडिंगयॉशी

@CodingYoshi अंत में उस प्रश्न (उपयोग ) का उत्तर देने के लिए मेरा उत्तर देखें .then()
रॉबर्ट सिएमर

413

इस तरह से भी अंतर होता है कि रिटर्न परिणाम संसाधित होते हैं (इसकी चेनिंग कहा जाता है, doneचेन नहीं करता है जबकि thenकॉल चेन पैदा करता है)

promise.then(function (x) { // Suppose promise returns "abc"
    console.log(x);
    return 123;
}).then(function (x){
    console.log(x);
}).then(function (x){
    console.log(x)
})

निम्नलिखित परिणाम लॉग हो जाएंगे:

abc
123
undefined

जबकि

promise.done(function (x) { // Suppose promise returns "abc"
    console.log(x);
    return 123;
}).done(function (x){
    console.log(x);
}).done(function (x){
    console.log(x)
})

निम्नलिखित मिलेगा:

abc
abc
abc

---------- अपडेट करें:

Btw। मैं उल्लेख करना भूल गया, यदि आप परमाणु प्रकार के मूल्य के बजाय एक वादा वापस करते हैं, तो बाहरी वादा तब तक इंतजार करेगा जब तक कि आंतरिक वादा हल नहीं हो जाता:

promise.then(function (x) { // Suppose promise returns "abc"
    console.log(x);
    return $http.get('/some/data').then(function (result) {
        console.log(result); // suppose result === "xyz"
        return result;
    });
}).then(function (result){
    console.log(result); // result === xyz
}).then(function (und){
    console.log(und) // und === undefined, because of absence of return statement in above then
})

इस तरह से यह समानांतर या अनुक्रमिक अतुल्यकालिक संचालन की रचना करने के लिए बहुत सरल हो जाता है:

// Parallel http requests
promise.then(function (x) { // Suppose promise returns "abc"
    console.log(x);

    var promise1 = $http.get('/some/data?value=xyz').then(function (result) {
        console.log(result); // suppose result === "xyz"
        return result;
    });

    var promise2 = $http.get('/some/data?value=uvm').then(function (result) {
        console.log(result); // suppose result === "uvm"
        return result;
    });

    return promise1.then(function (result1) {
        return promise2.then(function (result2) {
           return { result1: result1, result2: result2; }
        });
    });
}).then(function (result){
    console.log(result); // result === { result1: 'xyz', result2: 'uvm' }
}).then(function (und){
    console.log(und) // und === undefined, because of absence of return statement in above then
})

उपरोक्त कोड दो http अनुरोधों को समानांतर में जारी करता है और इस प्रकार अनुरोधों को जल्द पूरा करता है, जबकि नीचे उन HTTP अनुरोधों को क्रमिक रूप से चलाया जा रहा है जिससे सर्वर लोड कम हो जाता है।

// Sequential http requests
promise.then(function (x) { // Suppose promise returns "abc"
    console.log(x);

    return $http.get('/some/data?value=xyz').then(function (result1) {
        console.log(result1); // suppose result1 === "xyz"
        return $http.get('/some/data?value=uvm').then(function (result2) {
            console.log(result2); // suppose result2 === "uvm"
            return { result1: result1, result2: result2; };
        });
    });
}).then(function (result){
    console.log(result); // result === { result1: 'xyz', result2: 'uvm' }
}).then(function (und){
    console.log(und) // und === undefined, because of absence of return statement in above then
})

121
+1 उस धारणा के doneलिए जो परिणाम को thenबदलने के लिए कुछ भी नहीं करती है । अन्य लोगों द्वारा विशाल बिंदु चूक गया।
शनीमल

9
यह संभवतः उल्लेख करने योग्य है कि यह किस संस्करण पर लागू होता है, जो कि then1.8 में बदले हुए व्यवहार के बाद से लागू होता है
bradley.ayers

4
+1 सीधे बिंदु पर। मैंने एक शानदार उदाहरण बनाया यदि कोई भी देखना चाहता है कि मिश्रित doneऔर thenकॉल के साथ कौन सी चेन में परिणाम होता है।
माइकल क्रोपट

7
ऊपर दिए गए उदाहरण में यह भी बताया गया है कि 'किया' मूल रूप से शुरू किए गए मूल वादे पर काम करता है लेकिन 'फिर' एक नया वादा करता है।
पुलक कांति भट्टाचार्य

2
यह jQuery के 1.8+ पर लागू होता है। पुराने संस्करण doneउदाहरण की तरह काम करते हैं । बदलें thenकरने के लिए pipe1.8+ प्राप्त करने के लिए पूर्व 1.8 thenव्यवहार।
डेविड हार्कस

57

.done() केवल एक कॉलबैक है और यह सफलता कॉलबैक है

.then() सफलता और असफल कॉलबैक दोनों हैं

.fail() केवल एक असफल कॉलबैक है

इसलिए यह आपके ऊपर है कि आपको क्या करना चाहिए ... क्या आपको परवाह है कि क्या यह सफल होता है या यदि यह विफल रहता है?


18
आप यह उल्लेख करने में विफल रहते हैं कि 'फिर' कॉल श्रंखला का निर्माण करता है। देखिए लु 4 का जवाब
ऑलिगॉफ्रेन

आपका जवाब 2011 से है ... आजकल उनका रिटर्न वैल्यू then()बहुत अलग है done()। जैसा then()कि अक्सर केवल सफलता कॉलबैक के साथ कहा जाता है आपकी बात याद रखने / जानने के लिए मुख्य बात के बजाय एक विस्तार है। (यह नहीं कह सकते कि यह jQuery 3.0 से पहले कैसे था।)
रॉबर्ट सिएमर

14

deferred.done ()

केवल हैंडलर को तभी बुलाया जाता है जब डिफर्ड को हल किया जाता है । आप कॉल किए जाने वाले कई कॉलबैक जोड़ सकते हैं।

var url = 'http://jsonplaceholder.typicode.com/posts/1';
$.ajax(url).done(doneCallback);

function doneCallback(result) {
    console.log('Result 1 ' + result);
}

आप इस तरह से ऊपर भी लिख सकते हैं,

function ajaxCall() {
    var url = 'http://jsonplaceholder.typicode.com/posts/1';
    return $.ajax(url);
}

$.when(ajaxCall()).then(doneCallback, failCallback);

deferred.then ()

Deferred को हल करने, अस्वीकार करने या अभी भी प्रगति पर होने पर हैंडलर को बुलाया जाएगा ।

var url = 'http://jsonplaceholder.typicode.com/posts/1';
$.ajax(url).then(doneCallback, failCallback);

function doneCallback(result) {
    console.log('Result ' + result);
}

function failCallback(result) {
    console.log('Result ' + result);
}

आपकी पोस्ट स्पष्ट नहीं thenकरती है कि यदि कोई failकॉलबैक प्रदान नहीं किया गया है तो वह कैसा व्यवहार करता है - अर्थात् failमामले को पूरी तरह से कैप्चर नहीं करना
BM

असफल मामला एक अपवाद उठाता है जिसे कार्यक्रम के शीर्ष स्तर से पकड़ा जा सकता है। आप जावास्क्रिप्ट कंसोल में अपवाद भी देख सकते हैं।
डेविड स्पेक्टर

10

वहाँ वास्तव में एक बहुत महत्वपूर्ण अंतर है, jQuery के Deferreds के रूप में insofar वादा (और jQuery3.0 वास्तव में उन्हें कल्पना में लाने की कोशिश करता है) का एक कार्यान्वयन होने का मतलब है।

किया / तब के बीच महत्वपूर्ण अंतर यह है कि

  • .done() ALWAYS वही वादा / लिपटे हुए मूल्यों को देता है, जो आपने शुरू किया था, भले ही आप क्या करें या क्या लौटाएं।
  • .then() हमेशा एक नया वादा लौटाता है, और आप इस बात को नियंत्रित करने के प्रभारी होते हैं कि जो वादा आपने पारित किया है, उस पर आधारित है।

JQuery से देशी ES2015 वादों में अनुवादित, .done()एक प्रकार का "संरचना" एक वचन श्रृंखला में एक फ़ंक्शन के चारों ओर लागू करने की तरह है, उस में, यदि श्रृंखला "समाधान" स्थिति में है, तो फ़ंक्शन के लिए एक मान पास करें। लेकिन उस फ़ंक्शन का परिणाम श्रृंखला को स्वयं प्रभावित नहीं करेगा।

const doneWrap = fn => x => { fn(x); return x };

Promise.resolve(5)
       .then(doneWrap( x => x + 1))
       .then(doneWrap(console.log.bind(console)));

$.Deferred().resolve(5)
            .done(x => x + 1)
            .done(console.log.bind(console));

वे दोनों 5 नहीं, 6 लॉग करेंगे।

ध्यान दें कि मैंने लॉगिंग करने के लिए किया और किया हुआ है। ऐसा इसलिए है क्योंकि कंसोल.लॉग फ़ंक्शन वास्तव में कुछ भी वापस नहीं करते हैं। और यदि आप पास हो जाते हैं, तो एक फ़ंक्शन जो कुछ भी वापस नहीं करता है, तब क्या होता है?

Promise.resolve(5)
       .then(doneWrap( x => x + 1))
       .then(console.log.bind(console))
       .then(console.log.bind(console));

वह लॉग करेगा:

5

अपरिभाषित

क्या हुआ? जब मैंने इसका इस्तेमाल किया था। और इसे एक फंक्शन पास कर दिया, जिसमें कुछ भी वापस नहीं आया, तो यह निहित परिणाम "अपरिभाषित" था ... जो निश्चित रूप से एक वादा [अपरिभाषित] अगले तत्कालीन विधि पर लौटा, जो अपरिभाषित लॉग ऑन किया। इसलिए हमने जो मूल मूल्य शुरू किया था, वह मूल रूप से खो गया था।

.then()दिल में, फ़ंक्शन संरचना का एक रूप है: प्रत्येक चरण का परिणाम अगले चरण में फ़ंक्शन के तर्क के रूप में उपयोग किया जाता है। यही कारण है कि .done को "टैप" के रूप में सबसे अच्छा माना जाता है -> यह वास्तव में रचना का हिस्सा नहीं है, बस कुछ ऐसा है जो एक निश्चित कदम पर मूल्य को देखता है और उस मूल्य पर एक फ़ंक्शन चलाता है, लेकिन वास्तव में बदलता नहीं है किसी भी तरह से रचना।

यह एक बहुत ही मौलिक अंतर है, और शायद एक अच्छा कारण है कि देशी वादों के पास एक .done पद्धति खुद को लागू नहीं करती है। हम पूर्व संध्या में नहीं है कि वहाँ .fail विधि क्यों है, क्योंकि यह और भी अधिक जटिल है (अर्थात् .fail / / .catch .done / .then के दर्पण नहीं हैं -> .catch में कार्य जो नंगे मानों को वापस करते हैं। "स्टे" को उन लोगों की तरह खारिज कर दिया गया, जिन्हें वे पास कर चुके हैं, वे हल करते हैं! "


6

then()हमेशा इसका मतलब यह है कि इसे किसी भी मामले में बुलाया जाएगा। लेकिन गुजरने वाले पैरामीटर अलग-अलग jQuery संस्करणों में भिन्न हैं।

1.8 jQuery से पहले, then()बराबर है done().fail()। और सभी कॉलबैक फ़ंक्शन समान पैरामीटर साझा करते हैं।

लेकिन jQuery 1.8 के रूप में, then()एक नया वादा लौटाता है, और यदि इसका कोई मूल्य वापस आता है, तो इसे अगले कॉलबैक फ़ंक्शन में पास किया जाएगा।

आइए निम्नलिखित उदाहरण देखें:

var defer = jQuery.Deferred();

defer.done(function(a, b){
            return a + b;
}).done(function( result ) {
            console.log("result = " + result);
}).then(function( a, b ) {
            return a + b;
}).done(function( result ) {
            console.log("result = " + result);
}).then(function( a, b ) {
            return a + b;
}).done(function( result ) {
            console.log("result = " + result);
});

defer.resolve( 3, 4 );

1.8 jQuery से पहले, जवाब होना चाहिए

result = 3
result = 3
result = 3

सभी resultलेता है 3. और then()फ़ंक्शन हमेशा अगले फ़ंक्शन के लिए एक ही आस्थगित ऑब्जेक्ट पास करता है।

लेकिन jQuery 1.8 के रूप में, परिणाम होना चाहिए:

result = 3
result = 7
result = NaN

क्योंकि पहला then()फ़ंक्शन एक नया वादा लौटाता है, और मान 7 (और यह एकमात्र पैरामीटर है जो पास होगा) अगले को पास किया जाता है done(), इसलिए दूसरा done()लिखें result = 7। दूसरा then()7 के मान के रूप में aलेता है और मान के undefinedरूप में लेता है b, इसलिए दूसरा then()पैरामीटर NaN के साथ एक नया वादा करता है, और अंतिम done()NaN को उसके परिणाम के रूप में प्रिंट करता है।


"तो (हमेशा) का अर्थ है जो भी मामले में बुलाया जाएगा" - सच नहीं है। तब () वादा के अंदर त्रुटि के मामले में कभी नहीं कहा जाता है।
डेविड स्पेक्टर

दिलचस्प पहलू जो jQuery.Deferred()कई मूल्यों को प्राप्त कर सकता है, जो इसे पहले से ठीक से गुजरता है .then()। — हालांकि थोड़ा अजीब ... क्योंकि कोई भी निम्नलिखित .then()ऐसा नहीं कर सकता है। (द्वारा चुना गया इंटरफ़ेस returnकेवल एक मान वापस कर सकता है।) जावास्क्रिप्ट का मूल निवासी Promiseऐसा नहीं करता है। (जो अधिक सुसंगत है, ईमानदार होने के लिए।)
रॉबर्ट सीमर


2

केवल उपयोग करें .then()

ये नुकसान हैं .done()

  • जंजीर नहीं हो सकती
  • ब्लॉक resolve()कॉल (सभी .done()हैंडलर को सिंक्रोनाइज़ किया जाएगा)
  • resolve()पंजीकृत .done()संचालकों से अपवाद प्राप्त हो सकता है (!)
  • एक .done()आधे में एक अपवाद आस्थगित मारता है:
    • आगे .done()संचालकों को चुपचाप छोड़ दिया जाएगा

मैंने अस्थायी रूप से सोचा कि .then(oneArgOnly)हमेशा इसकी आवश्यकता होती है .catch()ताकि कोई अपवाद चुपचाप नजरअंदाज न हो, लेकिन यह सच नहीं है: unhandledrejectionघटना .then()कंसोल (डिफ़ॉल्ट के रूप में) पर अपवाद नहीं छोड़ती है। बहुत ही उचित! उपयोग करने के लिए कोई कारण नहीं बचा है .done()

सबूत

निम्नलिखित कोड स्निपेट से पता चलता है, कि:

  • सभी .done()हैंडलर को बिंदु के समकालिक कहा जाएगाresolve()
    • 1, 3, 5, 7 के रूप में लॉग इन किया
    • स्क्रिप्ट नीचे से गिरने से पहले लॉग इन किया
  • एक .done()प्रभाव resolve()कॉलर में अपवाद
    • चारों ओर से पकड़ने के माध्यम से लॉग इन किया resolve()
  • अपवाद आगे के .done()संकल्प से वादा तोड़ देता है
    • 8 और 10 लॉग नहीं हैं!
  • .then() इनमें से कोई भी समस्या नहीं है
    • धागा निष्क्रिय होने के बाद 2, 4, 6, 9, 11 के रूप में लॉग इन किया
    • (स्निपेट वातावरण में ऐसा नहीं है unhandledrejectionकि लगता है)

Btw, से अपवाद को .done()ठीक से नहीं पकड़ा जा सकता है: के तुल्यकालिक पैटर्न के कारण .done(), त्रुटि को या तो बिंदु पर फेंक दिया .resolve()जा सकता है (लाइब्रेरी कोड हो सकता है!) या .done()कॉल पर जो अपराधी को संलग्न करता है यदि आस्थगित पहले से ही हल हो जाता है।

console.log('Start of script.');
let deferred = $.Deferred();
// deferred.resolve('Redemption.');
deferred.fail(() => console.log('fail()'));
deferred.catch(()=> console.log('catch()'));
deferred.done(() => console.log('1-done()'));
deferred.then(() => console.log('2-then()'));
deferred.done(() => console.log('3-done()'));
deferred.then(() =>{console.log('4-then()-throw');
    throw 'thrown from 4-then()';});
deferred.done(() => console.log('5-done()'));
deferred.then(() => console.log('6-then()'));
deferred.done(() =>{console.log('7-done()-throw');
    throw 'thrown from 7-done()';});
deferred.done(() => console.log('8-done()'));
deferred.then(() => console.log('9-then()'));

console.log('Resolving.');
try {
    deferred.resolve('Solution.');
} catch(e) {
    console.log(`Caught exception from handler
        in resolve():`, e);
}
deferred.done(() => console.log('10-done()'));
deferred.then(() => console.log('11-then()'));
console.log('End of script.');
<script
src="https://code.jquery.com/jquery-3.4.1.min.js"
integrity="sha384-vk5WoKIaW/vJyUAd9n/wmopsmNhiy+L2Z+SBxGYnUkunIxVxAv/UtMOhba/xskxh"
crossorigin="anonymous"
></script>


कुछ चीजें: 1) मैं देख रहा हूं कि आप क्या कह रहे हैं जो doneनिष्पादित नहीं किया जाएगा यदि पिछले किए गए अपवाद हैं। लेकिन इसे चुपचाप नजरअंदाज क्यों किया जाएगा, मेरा मतलब है कि अपवाद हुआ इसलिए आप कहते हैं कि यह चुप है। 2) मैं Deferredवस्तु का तिरस्कार करता हूं क्योंकि इसका एपीआई बहुत खराब तरीके से किया गया है। यह बहुत जटिल और भ्रामक है। यहां आपका कोड या तो आपकी बात को साबित करने में मदद नहीं करता है और आपके पास जो साबित करने की कोशिश कर रहा है, उसके लिए बहुत अधिक गैर-जरूरी जटिलता है। 3)done 2 से 4, और 6 पर सूचकांक 2 से पहले क्यों किया जाता है then?
कोडिंगयॉशी

मेरा बुरा, हां निश्चित रूप से एक वोट का हकदार है। अपवाद के बारे में आपकी टिप्पणी के लिए, आम तौर पर यह है कि अपवाद कैसे काम करते हैं: एक बार उठाए जाने के बाद, कोड को निष्पादित नहीं किया जाएगा। इसके अलावा jQuery के दस्तावेज़ में कहा गया है कि यह केवल तभी निष्पादित किया जाएगा जब आस्थगित हल हो जाए।
कोडिंगयॉशी

@CodingYoshi यहां स्थिति अलग है: मैं केवल हल किए गए वादों / आस्थगितों के बारे में बात कर रहा था। मुझे यह शिकायत नहीं है कि बाकी सफलता-हैंडलर को नहीं बुलाया जाता है, जो सामान्य है। लेकिन मुझे कोई कारण नहीं दिखता कि एक सफल वादे पर पूरी तरह से अलग-अलग सफलता हासिल करने वाले को क्यों नहीं बुलाया जाता। सभी .then()को बुलाया जाएगा, अपवाद (उन हैंडलर में) उठाया या नहीं। लेकिन इसके अलावा / शेष .done()विराम।
रॉबर्ट सिएमर

@CodingYoshi मैंने अपने उत्तर में बहुत सुधार किया, अगर मुझे कहने की अनुमति दी जाए। कोड और पाठ।
रॉबर्ट सिएमर

1

JQuery 3.0 के रूप में एक और महत्वपूर्ण अंतर है जो आसानी से अप्रत्याशित व्यवहार का कारण बन सकता है और पिछले उत्तरों में उल्लेख नहीं किया गया है:

निम्नलिखित कोड पर विचार करें:

let d = $.Deferred();
d.done(() => console.log('then'));
d.resolve();
console.log('now');
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.0.0/jquery.min.js"></script>

यह उत्पादन होगा:

then
now

अब, उसी स्निपेट done()द्वारा प्रतिस्थापित करें then():

var d = $.Deferred();
d.then(() => console.log('then'));
d.resolve();
console.log('now');
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.0.0/jquery.min.js"></script>

उत्पादन अब है:

now
then

इसलिए, तुरंत हल किए गए आस्थगितों के लिए, फ़ंक्शन को पास करने के done()लिए हमेशा एक समकालिक तरीके से लागू किया जाएगा, जबकि किसी भी तर्क को पास करने के then()लिए async को आमंत्रित किया जाता है।

यह पूर्व के jQuery संस्करणों से भिन्न होता है, जहाँ दोनों कॉलबैक को तुल्यकालिक रूप से कहा जाता है, जैसा कि उन्नयन गाइड में बताया गया है :

वादा / ए + अनुपालन के लिए एक और व्यवहार परिवर्तन की आवश्यकता है कि आस्थगित () कॉलबैक को हमेशा अतुल्यकालिक कहा जाता है। पहले, अगर एक .then () कॉलबैक को पहले से हल या अस्वीकार किए गए एक Deferred में जोड़ा गया था, तो कॉलबैक तुरंत और समकालिक रूप से चलेगा।


-5

.done()वादा श्रृंखला को समाप्त करता है, और सुनिश्चित करता है कि और कुछ भी कदम आगे नहीं बढ़ा सकते हैं। इसका मतलब यह है कि jQuery वादा कार्यान्वयन किसी भी अखंड अपवाद को फेंक सकता है, क्योंकि कोई भी इसका उपयोग करना संभव नहीं कर सकता है .fail()

व्यावहारिक रूप से, यदि आप एक वादा करने के लिए अधिक चरणों को संलग्न करने की योजना नहीं बनाते हैं, तो आपको उपयोग करना चाहिए .done()। अधिक विवरण के लिए देखें कि वादे क्यों करने पड़ते हैं


6
सावधान! यह उत्तर कई वादों के क्रियान्वयन के लिए सही होगा, लेकिन jQuery के नहीं, जिसमें .done()एक समाप्ति भूमिका नहीं है। दस्तावेज़ीकरण कहता है, "चूंकि deferred.done () आस्थगित ऑब्जेक्ट को वापस करता है, आस्थगित ऑब्जेक्ट के अन्य तरीकों को अतिरिक्त .done () विधियों सहित, इस एक को जंजीर किया जा सकता है"। .fail()उल्लेख नहीं है लेकिन, हाँ, यह भी जंजीर किया जा सकता है।
Roamer-1888

1
मेरा बुरा, jQuery की जाँच नहीं की
gleb bahmutov

1
@glebbahmutov - शायद आपको यह उत्तर हटा देना चाहिए ताकि दूसरे भ्रमित न हों? बस एक दोस्ताना सुझाव :)
एंड्री

2
कृपया उत्तर को न हटाएं, इससे लोगों को अपनी गलतफहमी दूर करने में मदद मिल सकती है।
मेलिसा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.