Подтвердить что ты не робот

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 и, черт возьми, с браузерами, которые его не поддерживают.

4b9b3361

Ответ 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) {
  // ...
});