angularjs - Angular HttpPromise: الاختلاف بين أساليب `success`/` error` ووسائط `then`'s




(4)

وفقًا لملف AngularJS ، تُرجع المكالمات إلى $http ما يلي:

إرجاع كائن وعد باستخدام الطريقة القياسية ثم طريقتين خاصتين لـ http: النجاح والخطأ . الأسلوب ثم يأخذ وسيطتين نجاح و رد اتصال خطأ الذي سيتم استدعاؤه مع كائن استجابة. تأخذ أساليب النجاح والخطأ وسيطة واحدة - وهي دالة سيتم استدعائها عند نجاح الطلب أو فشله على التوالي. يتم تمرير الوسائط التي تم تمريرها إلى هذه الوظائف تمثيل كائن الاستجابة الذي تم تمريره إلى الأسلوب ثم.

وبصرف النظر عن حقيقة أن كائن response يتم تدميره في حالة واحدة ، فأنا لا أحصل على الفارق بينهما

  • تم تمرير الاسترجاعات promise.then / الخطأ كحجج promise.then
  • مرت callbacks كحجج promise.success / promise.error أساليب promise.error من الوعد

هل هنالك أي؟ ما الهدف من هاتين الطريقتين المختلفتين لتمرير استدعاءات متطابقة ظاهريًا؟


.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)

أمثلة العمل:

إليك شيء كتبته بتنسيق أكثر codey لتحديث ذاكرتي حول كيفية تشغيل كل شيء من خلال معالجة الأخطاء وما إلى ذلك:

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


بعض أمثلة التعليمات البرمجية لطلب 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
});

هناك بعض الإجابات الجيدة هنا بالفعل. لكن من الجدير بنا أن نقود الفرق في التوازي المقدم:

  • 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() بالتوازي

ملحوظة: هذا الجواب غير صحيح في الواقع. كما هو موضح في تعليق أدناه ، فإن النجاح () يعيد الوعد الأصلي. لن أتغير واتركه لـ OP للتعديل.

الفرق الرئيسي بين 2 هو أن استدعاء .then() إرجاع وعد (حل مع قيمة تم إرجاعها من رد اتصال) بينما يكون .success() طريقة تقليدية أكثر لتسجيل عمليات الاسترجاع ولا يعيد الوعد.

.then() المستندة إلى .then() ( .then() ) في تسهيل وعود السلسلة (إجراء مكالمة وتفسير النتائج ثم إجراء مكالمة أخرى وتفسير النتائج وإجراء مكالمة أخرى وما إلى ذلك).

طريقة .success() هي طريقة مبسطة ومريحة عندما لا تحتاج إلى إجراء مكالمة سلسلة ولا تعمل مع واجهة برمجة التطبيقات (على سبيل المثال ، في التوجيه).

باختصار:

  • .then() - القوة الكاملة للوعد API ولكن مطول أكثر قليلا
  • .success() - لا يعيد الوعد ولكنه يقدم بناء أكثر تواضعا




promise