Обещание отклонено с предупреждением об ошибке

Ошибка: h1.js:25 Warning: a promise was rejected with a non-error: [object String]

Не совсем уверен, почему, хотел бы помочь понять ошибку и что ее вызывает. Все еще изучаю Обещания и AJAX, так что помощь очень ценится! (Например, когда я пишу это, я также думаю, что иметь обещание оборачивать объект ajax немного избыточно, но, честно говоря, я не знаю, как переписать его иначе)

var logisticsModule = (function() {
  return {
    initialize: function() {
      dateTimeFxns.getReservedDates.then(
        // success
        function(reserved_dates) {
          console.log("success with value = " + reserved_dates)
        },
        function(error) {
          console.log("error with value = " + error)
        }
      )
    }
  }
})();

var dateTimeFxns = {
  getReservedDates: new Promise( function(resolve, reject) {
    $.ajax({ 
      // some url & data
    })
    .done(function(result) {
      resolve(result)
    }
    .fail(function(error) {
      reject(error)
    }
  })
}

$(document).ready(function() {
  logisticsModule.initialize();
})

Предупреждающее сообщение ОБНОВЛЕНИЕ сохраняется, когда у меня есть .fail как:

.fail(function(jqXHR, textStatus, errorThrown) {
  reject(new Error(errorThrown))
})

2 ответа

Это просто означает, что сгенерированная ошибка не instanceof Error, Например, следующее не является ошибкой, но я могу выбросить его, потому что... ну... вы можете выбросить что-нибудь в JavaScript.

throw 42;

Что дает нам замечательный uncaught exception: 42,

Чтобы сгенерировать фактическую ошибку, используйте Error:

throw new Error('An actual error');

Теперь в вашем конкретном случае вам нужно передать ошибку, которую выдает jQuery, и это не первый аргумент, который она передает. Это дает вам строку, так что оберните ее в ошибку...

.fail(function(jqXHR, textStatus, errorThrown ) {
  reject(new Error(errorThrown));
}

Например, когда я пишу это, я также думаю, что это немного избыточно, чтобы Promise обернул объект ajax, но, честно говоря, я не знаю, как переписать его иначе

Вы можете определить функцию, которая возвращает объект AJAX, который указан в документах jQuery, возвращает объект, который использует интерфейс JavaScript Promise.

Объекты jqXHR, возвращаемые $.ajax() из jQuery 1.5, реализуют интерфейс Promise, предоставляя им все свойства, методы и поведение Promise (см. Отложенный объект для получения дополнительной информации).

Вот пример кода того, как реализовать такую ​​функцию. Я использую API случайных пользователей для примера данных.

function getRandomUser() {
  return $.ajax({
    url: 'https://randomuser.me/api/',
    dataType: 'json'
  })
  .fail(error => console.error(error));
}

// getRandomUser's return value is a Promise like object, which we can chain onto
getRandomUser()
.then(
  function(random_user) {
    console.log("success with value = ", random_user)
  },
  function(error) {
    console.log("error with value = ", error)
  }
);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

Другие вопросы по тегам