कोणीय HttpPromise: `सफलता` /` त्रुटि` के तरीकों और `तब` के तर्कों के बीच अंतर


177

AngularJS doc के अनुसार , $httpनिम्नलिखित को वापस करने के लिए कॉल करता है :

मानक और फिर दो http विशिष्ट विधियों के साथ एक वादा वस्तु लौटाता है : सफलता और त्रुटितो विधि दो तर्क एक लेता है सफलता और एक त्रुटि कॉलबैक जो एक प्रतिक्रिया वस्तु के साथ बुलाया जाएगा। सफलता और त्रुटि एक समारोह है कि जब अनुरोध सफल होता है या क्रमशः विफल रहता है बुलाया जाएगा - तरीकों एक भी तर्क ले। इन कार्यों में दिए गए तर्क तत्कालीन पद्धति में पारित प्रतिक्रिया वस्तु के विनाशकारी प्रतिनिधित्व हैं।

इस तथ्य के अलावा कि responseवस्तु एक मामले में नष्ट हो जाती है, मुझे इसके बीच अंतर नहीं मिलता है

  • की सफलता / त्रुटि कॉलबैक के तर्क के रूप में पारित किया गया promise.then
  • कॉलबैक वादे के promise.success/ promise.errorतरीकों के लिए तर्क के रूप में पारित किया

क्या वहाँ कोई? प्रतीत होता है समान कॉलबैक पास करने के लिए इन दो अलग-अलग तरीकों का क्या मतलब है?

जवाबों:


156

NB यह उत्तर तथ्यात्मक रूप से गलत है; जैसा कि नीचे एक टिप्पणी द्वारा बताया गया है, सफलता () मूल वादा वापस करती है। मैं नहीं बदलूंगा; और इसे संपादित करने के लिए ओपी पर छोड़ दें।


2 के बीच प्रमुख अंतर यह है कि .then()कॉल रिटर्न एक वादा करता है (कॉलबैक से लौटाए गए मूल्य के साथ हल किया जाता है) जबकि .success()कॉलबैक रजिस्टर करने का अधिक पारंपरिक तरीका है और वादा वापस नहीं करता है।

वादा-आधारित कॉलबैक ( .then()) श्रृंखला वादों को करना आसान बनाते हैं (एक कॉल करें, परिणामों की व्याख्या करें और फिर एक और कॉल करें, परिणामों की व्याख्या करें, फिर भी एक और कॉल करें)।

.success()विधि एक सुव्यवस्थित, सुविधा विधि जब आप (मार्ग में, उदाहरण के लिए) श्रृंखला कॉल और न ही वादा एपीआई के साथ काम करने की जरूरत नहीं है है।

संक्षेप में:

  • .then() - वादा एपीआई की पूरी शक्ति लेकिन थोड़ा और अधिक क्रिया
  • .success() - एक वादा वापस नहीं करता है, लेकिन थोड़ा और अधिक सरल वाक्यविन्यास प्रदान करता है

44
एक और बड़ा अंतर यह है कि thenप्रतिक्रिया - - जब कॉलबैक एक भी तर्क ले successऔर errorके रूप में arguments-- प्रतिक्रिया के व्यक्तिगत घटकों ले data, status, header, और config
मिशेल टाइली

1
@BrandonTilley पूरी तरह से सही है, लेकिन सवाल के लेखक ने इसे पहले से ही समझ लिया है इसलिए मुझे ऐसा महसूस नहीं हुआ कि मुझे इसे यहां दोहराने की आवश्यकता है।
pkozlowski.opensource

45
यद्यपि दस्तावेज़ स्पष्ट रूप से नहीं कहते हैं, हम यह अनुमान लगा सकते हैं कि .success()विधि मूल $ http वादा वस्तु लौटाती है, क्योंकि श्रृंखला $http(...).success(...).error(...)संभव है। यदि, जैसा उचित लगता है, उलटा $http(...).error(...).success(...)भी संभव है, तो .error()मूल वादा वस्तु भी वापस करना चाहिए। अंतर .then()यह है कि यह एक नया वादा लौटाता है ।
चुकंदर-चुकंदर

2
$ Http सेवा के कोणीय.जेएस से स्रोत कोड: promise.success = function(fn) { promise.then(function(response) { fn(response.data, response.status, response.headers, config); }); return promise; };
एलेक्स चे

6
कृपया ध्यान दें कि successपदावनत कर दिया गया है। से docs.angularjs.org/api/ng/service/$http#deprecation-notice The $http legacy promise methods success and error have been deprecated. Use the standard then method instead. If $httpProvider.useLegacyPromiseExtensions is set to false then these methods will throw $http/legacy error.
सैम Barnum

204

यहां पहले से ही कुछ अच्छे जवाब हैं। लेकिन घर की पेशकश की समानता के अंतर को ड्राइव करना सार्थक है:

  • success() मूल वादा वापस करता है
  • then() एक नया वादा लौटाता है

अंतर then()ड्राइव अनुक्रमिक संचालन है, क्योंकि प्रत्येक कॉल एक नया वादा लौटाता है।

$http.get(/*...*/).
  then(function seqFunc1(response){/*...*/}).
  then(function seqFunc2(response){/*...*/})
  1. $http.get()
  2. seqFunc1()
  3. seqFunc2()

success() समानांतर संचालन चलाता है, क्योंकि हैंडलर एक ही वादे पर जंजीर हैं।

$http(/*...*/).
  success(function parFunc1(data){/*...*/}).
  success(function parFunc2(data){/*...*/})
  1. $http.get()
  2. parFunc1(), parFunc2()समानांतर में

3
नोट नया वादा प्रतिक्रिया में एक बार लौट आए thenपरिणामों में पहुँच जाता है successऔर errorतरीकों गायब। इसके अलावा, http त्रुटि प्रतिक्रियाओं (जैसे 404) के लिए पहली thenमें http.then(ok, err).then(ok, err)करने के लिए पारित करेंगे errहैंडलर लेकिन निम्नलिखित लोगों में पारित करेंगे okहैंडलर। मूल रूप http.success().error().success().error()से श्रृंखलाबद्ध हैं, लेकिन $ q वादे काफी भिन्न हैं कि वे सभी विशेष रूप से निपटने के वादे और अनुक्रम के बारे में हैं (और http अनुरोध से निपटने के लिए नहीं)। मुझे यह समझने में कठिन समय लगा जब तक मैंने करीब से नहीं देखा।
जिममोंट

1
@jimmont successऔर errorएक वादे के सामान्य एपीआई नहीं हैं, वे $ http () के वापसी मूल्य पर बोल्ट किए जाते हैं।
Event_jr

धन्यवाद @event_jr यह मेरे लिए स्पष्ट है, और डॉक्स में कहा जाता है। जैसा कि स्पष्ट नहीं था (मेरे लिए) है कि कैसे $ q और $ http विभिन्न समस्याओं को हल करने के साथ-साथ नए वादों को वापस करने के लिए बनाम एक ही पास से गुजर रहा है - जैसा कि आपके (सुपर सहायक) उत्तर में बताया गया है।
जेममोंट

1
जेएस सिंगल-थ्रेडेड होने के बाद आपको समानांतर से क्या मतलब है? क्या आपका मतलब है कि निष्पादन आदेश गैर-नियतात्मक है?
डेरेक

2
@ डेरेक successपहले निष्पादित किए जाने के बाद दूसरे को निष्पादित करेगा लेकिन इससे पहले कि कोई वादा वापस किया जाए, हल हो जाता है जबकि दूसरा thenइंतजार करेगा। यदि आप वादे वापस नहीं कर रहे हैं तो दोनों समान व्यवहार करते हैं।
तमलिन

114

सरल GET अनुरोध के लिए कुछ कोड उदाहरण। शायद यह अंतर समझने में मदद करता है। का उपयोग कर then:

$http.get('/someURL').then(function(response) {
    var data = response.data,
        status = response.status,
        header = response.header,
        config = response.config;
    // success handler
}, function(response) {
    var data = response.data,
        status = response.status,
        header = response.header,
        config = response.config;
    // error handler
});

का उपयोग करते हुए success / error:

$http.get('/someURL').success(function(data, status, header, config) {
    // success handler
}).error(function(data, status, header, config) {
    // error handler
});

5
धन्यवाद, लेकिन यह सवाल इस अंतर के बारे में अधिक था कि ये कार्य क्या करते हैं या क्या कारण है कि वे दोनों एक ही काम करते हैं। उन्हें उपयोग करने के तरीके में अंतर डॉक्टर से समझा जा सकता है।
ईजबौद

39
मुझे व्यक्तिगत रूप से शॉर्ट कोड उदाहरण पसंद हैं, और यही मैंने उन्हें यहाँ पोस्ट किया है। कोणीय डॉक्स कभी-कभी छोटे सटीक उदाहरणों को याद करते हैं।
हिप्पो

2
यह महत्वपूर्ण है कि इस तथ्य पर प्रकाश डाला जाए कि पहली gist की प्रतिक्रिया वस्तु में दूसरी gist का "डेटा, स्टेटस, हेड और कॉन्फिगर" शामिल है। इसका मतलब है कि प्रतिक्रिया वस्तुओं में गहराई का एक स्तर है।
जियोम

क्या data,status,header,configकेवल वापसी पर चर के प्रति प्रतिक्रिया मूल्यों को पारित करने का कोई लाभ है response?
ᴍᴀᴛᴛ ᴍᴀᴛᴛ

27

.then () श्रृंखलाबद्ध है और पिछले .then () को हल करने के लिए प्रतीक्षा करेगा।

.success () और .error () को जंजीर किया जा सकता है, लेकिन वे सभी एक ही बार में आग लगा देंगे (इसलिए उस पर ज्यादा ध्यान नहीं दिया जाएगा)

.success () और .error () साधारण कॉल (आसान निर्माता) के लिए बहुत अच्छे हैं:

$http.post('/getUser').success(function(user){ 
   ... 
})

इसलिए आपको यह टाइप करने की जरूरत नहीं है:

$http.post('getUser').then(function(response){
  var user = response.data;
})

लेकिन आम तौर पर मैं .Catch () के साथ सभी त्रुटियों को नियंत्रित करता हूं:

$http.get(...)
    .then(function(response){ 
      // successHandler
      // do some stuff
      return $http.get('/somethingelse') // get more data
    })
    .then(anotherSuccessHandler)
    .catch(errorHandler)

यदि आपको समर्थन करने की आवश्यकता है <= IE8 तो अपना .catch () और .finally () इस तरह से लिखें (IE में आरक्षित तरीके):

    .then(successHandler)
    ['catch'](errorHandler)

कार्य उदाहरण:

यहाँ कुछ है जो मैंने अपनी स्मृति को ताज़ा करने के लिए और अधिक कोडी प्रारूप में लिखा है कि यह सभी त्रुटियों को कैसे संभालता है आदि:

http://jsfiddle.net/nalberg/v95tekz2/


एकमात्र उत्तर जो दिखाता है कि "रिटर्न-
अदर

17

बस पूरा करने के लिए, यहां एक कोड उदाहरण है जो मतभेदों को दर्शाता है:

सफलता \ त्रुटि:

$http.get('/someURL')
.success(function(data, status, header, config) {
    // success handler
})
.error(function(data, status, header, config) {
    // error handler
});

फिर:

$http.get('/someURL')
.then(function(response) {
    // success handler
}, function(response) {
    // error handler
})
.then(function(response) {
    // success handler
}, function(response) {
    // error handler
})
.then(function(response) {
    // success handler
}, function(response) {
    // error handler
}).

महान ?, क्या आपके पास एक उदाहरण है जहां संघटन उपयोगी हो सकता है?
जियोम

4
विचार यह है कि "तब" दृष्टिकोण अधिक उपयोगी है, क्योंकि आप एक के बाद एक और अतुल्यकालिक संचालन को अधिक आसानी से लिख सकते हैं।
माइकलेल

2

आधिकारिक सूचना: सफलता और त्रुटि को हटा दिया गया है, कृपया इसके बजाय मानक तब विधि का उपयोग करें।

पदावनति नोटिस: $ http की विरासत वादे के तरीके सफलता और त्रुटि को हटा दिया गया है। इसके बजाय मानक तो विधि का उपयोग करें। यदि $ httpProvider.useLegacyPromiseExtensions को झूठा सेट किया जाता है तो ये तरीके $ http / विरासत त्रुटि को फेंक देंगे।

लिंक: https://code.angularjs.org/1.5.7/docs/api/ng/service/$http

स्क्रीनशॉट: स्क्रीनशॉट देखें

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