JQuery ajax с ES6 Promises
Я пытаюсь сделать запрос на почту через jQuery, используя обещание ES6:
У меня есть функция:
getPostPromise(something, anotherthing) {
return new Promise(function(resolve, reject) {
$.ajax({
url: someURL,
type: 'post',
contentType: 'application/json; charset=utf-8',
data: JSON.stringify(
something: something,
anotherthing: anotherthing
}),
dataType: 'json',
success: resolve,
error: reject
});
});
}
и я называю это так:
getPostPromise(
'someFooStuff',
'someBarStuff'
).then(
function(returnedData) {
console.log("Good: ", returnedData);
},
function(responseObject) {
console.log("Bad: ", responseObject);
}
).catch(
function(errorThrown) {
console.log("Exception: ", errorThrown);
}
);
Мой сервер возвращает ответ, как и ожидалось, с телом запроса, который находится в формате JSON, но мой вывод в консоли:
Хорошо: undefined
Почему я не получаю возвращенные данные?
Спасибо кому-нибудь за любую помощь.
--- ИЗМЕНЕНИЕ ОБНОВЛЕНИЯ ---
Я уменьшил свой js только:
import $ from 'jquery';
$.get('http://localhost:8008/api/user')
.done(function(data) {
console.log(data);
});
Я все еще получаю undefined как вывод. Если я открою запрос на вкладке сети, я увижу объект ответа с правильными данными. Запрос сделан, мой сервер счастлив и отвечает, а результаты находятся в моем браузере, но параметр данных done - undefined. Я в тупике.
--- ОБНОВЛЕНИЕ 2 - РЕШЕНИЕ НАЙДЕНО ---
Я обнаружил, что проблема заключалась в использовании: https://github.com/jpillora/xdomain, чтобы обойти CORS. Казалось бы, эта библиотека как-то подталкивает обратно. Я удалил его и правильно выполнил CORS и, черт возьми, с браузерами, которые его не поддерживают.
Ответы
Ответ 1
jQuery Ajax-методы возвращают promises сами, вам не нужно их вообще обертывать.
Но вы можете, конечно, сделать это для соответствия API-интерфейсу ES6.
UPDATE jQuery 3.0+ реализует API Promise/A +, поэтому больше нет причин для переноса в современном jQuery. Ознакомьтесь с особенностями реализации обещания jQuery до версии 3.0.
Для версий jQuery до 3.0 я бы разделил их больше, чем вы:
function ajax(options) {
return new Promise(function (resolve, reject) {
$.ajax(options).done(resolve).fail(reject);
});
}
и
ajax({
url: someURL,
type: 'post',
contentType: 'application/json; charset=utf-8',
data: JSON.stringify({
something: something,
anotherthing: anotherthing
})
}).then(
function fulfillHandler(data) {
// ...
},
function rejectHandler(jqXHR, textStatus, errorThrown) {
// ...
}
).catch(function errorHandler(error) {
// ...
});