Обещание отклонено с предупреждением об ошибке
Ошибка: 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>