#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
метод, потому что он БУДЕТ выполнен.