Различия между укрытыми AJAX и promises

В другом вопросе StackOverflow на Испанском языке ссылаются на вызовы укрытых AJAX и ответ предлагает использовать promises вместо того, чтобы укрывать вызовы AJAX. И с этого времени я появились какие-то сомнения.

Заметь: я буду использовать нотацию jQuery удаляя достаточно параметров и называя функции для того, чтобы он был более легким для того, чтобы быть прочитанным. Он не значит, что этот вопрос - на jQuery или AJAX в jQuery.

Главным образом то, что задает вопрос, это:

Расположи в порядке В

$.ajax({
    url: URL1,
    success: function() {
        a1();
        $.ajax({
            url: URL2,
            success: function() {
                a2();
            },
            error: function() {
                b2();
            }
        });
    },
    error: function() {
        b1();
    }
});

И то, что предлагается в ответе, что-то как это:

Структура B

var promise = $.ajax({
    url: URL1,
    success: function() {
        a1();
    },
    error: function() {
        b1();
    }
});

promise.then(function() { 
    $.ajax({
        url: URL2,
        success: function() {
            a2();
        },
        error: function() {
            b2();
        }
    });
});

И сейчас мои сомнения:

  • Структура A и B они эквивалентные? Каково различие между ними?
  • Какое-то преимущество есть из-за того, что использует одну на другой?
  • Это какой-либо из методов, рекомендуемых на другом?

18
задан 13.04.2017, 16:00
2 ответа

Различие коренится в возможности содержания, и в управлении ошибок. Также гораздо более легкий debug

Promises позволяет тебе поддерживать неизменность в твоих методах, деривате функционального программирования, в то время как с callbacks он более повелительный.

Другое преимущество, которое у него есть, состоит в том, что promises он родной JS, и в отличие от выбора Jquery, - стандарт.

Также он предотвращает тебя убегать от callback hell XD introducir la descripción de la imagen aquí

Со связью со структурами, что ты упоминаешь в твоем вопросе о части promises, он изменил бы ее немного для того, чтобы он был эквивалентным

new Promise(function(resolve, reject) {
      $.ajax({
          url: URL1,
          success: function(data) { // si recibo algún dato como parametro
            resolve(data); //Resuelvo la promesa (la cumplo) y con esto se puede recibir como parámetro 
            a1();
          },
          error: function(CausaDelError) {
            reject(CausaDelError); //marco la promesa como incumplida y paso como parámetro el porque no se cumplió
            b1();
          };
        })
        .then(function() { //Notese que no necesito declarar la variable
          $.ajax({
            url: URL2,
            success: function() {
              a2();
            },
            error: function() {
              b2();
            }
          });
        })
        .catch(function(error) {
          //Capturo los errores posibles en la primer promesa o en la segunda (then)
          console.log(error);
        });

У Udacity есть бесплатный очень короткий курс, который объясняет очень простой формы и быстрого promises

16
ответ дан 24.11.2019, 14:55
  • 1
    Хороший explicaci и # 243; n. На этом AJAX в jQuery, s и # 243; это использовал notaci и # 243; n в вопросе, но podr и # 237; чтобы определять мой собственный funci и # 243; n с c и # 243; я говорю родной JS. – Alvaro Montoro♦ 03.02.2016, 01:53
  • 2
    +1 из-за этого Tambi и # 233; n он предотвращает тебя убегать от callback hell XD – Wilfredo 03.02.2016, 16:42

Это не отвечает ни на один из твоих трех вопросов, но как альтернатива aquГ - у тебя есть родной herramineta в JavaScript с относительно мало, Fetch API, которая может требовать polyfill для неких мореходов и использует Promises.

const url 		= 'https://api.myjson.com/bins/3ko1q',
      method 	= 'GET',
      headers   = new Headers({'Content-Type' : 'application/json'});
      
const req = new Request(url, { method, headers });

fetch(req)
  .then( res => res.ok ? res.json() : undefined )
  .then( data => JSON.stringify(data) )
  .then(alert)
  .catch(console.error.bind(console));
4
ответ дан 24.11.2019, 14:55

Теги

Похожие вопросы