Значение обещания Ember / RSVP изменяется при передаче в resolve ()

#ember.js #rsvp.js

#ember.js #rsvp.js

Вопрос:

Я пытаюсь обернуть запрос jQuery AJAX в обещание Ember RSVP, и у меня возникла проблема, из-за которой значение, которое я отправляю resolve функции (которое является jqXHR параметром), изменяется с object на string .

Код для выполнения запроса создания запроса выглядит следующим образом:

 return new Ember.RSVP.Promise(function(resolve, reject) {
  Ember.$.ajax([URL], {
    type: 'POST',
    dataType: 'text'
  }).then((data, textStatus, jqXHR) => {
    console.log(jqXHR);
    resolve(jqXHR);
  }, (jqXHR, textStatus, errorThrown) => {
    resolve(jqXHR);
  });
});
  

И в моем контроллере я обрабатываю запрос следующим образом:

 promise.then((response) => {
  console.log(response);
  if (response.status === 200) {
    something...
  } else {
    something else...
  }
  receipt.set('busy', false);
});
  

Теперь, исходя из базового (и, вероятно, ошибочного) понимания, которое я имею о RSVP.Обещаю, resolve(jqXHR) строка должна отправлять jqXHR объект в качестве параметра для обратного вызова, верно?

Проблема в том, что когда я печатаю response полученное в консоли, все, что я получаю 200 success , это тело HTTP-запроса, который я выполняю.

Однако, когда я печатаю jqXHR перед его разрешением, он правильно печатает весь объект:

 Object {readyState: 4, responseText: "200 success", status: 200, statusText: "OK"}
  

Итак, почему это происходит? Делает ли Ember какую-то странную черную магию и преобразует jqXHR объект в строку? Или data строка отправляется вместо jqXHR объекта, который я ожидаю?

Спасибо!

Комментарии:

1. Вы знаете, что можете сделать Ember.RSVP.resolve($.ajax(...)).then(...) ?

2. resolve(jqXHR) Попробуйте отправить данные и статус тоже так resolve(data,jqXHR.status)

3. @Lux Да, но метод jQuery ajax принимает два обратных вызова, и jqXHR первый в done обратном вызове и третий в fail обратном вызове, поэтому я пытаюсь немного изменить порядок параметров, прежде чем выполнить свое обещание.

4. Не знаю об этом преобразовании, возможно, потребуется свериться с исходным кодом.

5. @kumkanillam проверил, что было в исходном коде, и я нашел ответ на свой вопрос. Я опубликую это здесь в качестве ответа, это вас интересует. Спасибо за вашу помощь!

Ответ №1:

Понял!

Хорошо, так, по-видимому rsvp.js , проверяется, является ли объект, отправленный resolve методу, «доступным для чтения» (то есть, если он содержит then метод.

Если оно ‘thenable’, оно выполнит then метод объекта, примет его первый аргумент (только) и примет его как выполненное значение. Эта маленькая магия позволяет разрешать цепочки, но не очень хорошо работает с обратными вызовами, которые принимают несколько аргументов.

Итак, в моем случае я отправлял jqXHR для разрешения, который содержит then метод (согласно документации jQuery). Затем RSVP попытался выполнить объект jqXHR как обещание и вернул первый аргумент resolve обратного вызова.

Теперь сигнатура для обратного вызова jqXHR resolve function(data, textStatus, jqXHR); , поэтому объект, отправленный на МОЙ обратный вызов, был не jqXHR таким, как я ожидал, а был первым аргументом jqXHR обратного вызова resolve : data .

TL; DR: проверьте, имеет ли объект, с помощью которого вы пытаетесь разрешить свое обещание, then метод, потому что он БУДЕТ выполнен.