Верните пустое обещание
У меня есть функция, которая возвращает обещание jQuery. Это выглядит так:
addBooks(books: Array<Books>) {
return $.ajax({
url: '/Books/AddBooks/',
type: 'POST',
data: ko.toJSON(books),
contentType: 'application/json'
});
}
Я делаю это, чтобы повторно использовать эту функцию и выполнять вызовы с цепочкой обеими словами:
addBooks.done(() => { alert("Books added!"); })
Мой вопрос в том, что, если я хочу рано вырваться из addBooks и предотвратить поездку на сервер. Например:
addBooks(books: Array<Books>) {
// An empty array was passed in for some reason.
// Theres nothing to add so dont try to POST
if (books <= 0) return null;
return $.ajax({
url: '/Books/AddBooks/',
type: 'POST',
data: ko.toJSON(books),
contentType: 'application/json'
});
}
Мой пример не будет компилироваться, потому что мой прикованный пример обратного вызова ожидает, что addBooks
вернет объект обещания, а не null. Как я могу вернуть пустое обещание (или какой бы правильный объект мне не вернул в ситуации)?
Ответы
Ответ 1
Как я могу вернуть пустое обещание (или какой бы верный объект мне не вернул в ситуации)?
Да, здесь подразумевается "пустое обещание", если вы имеете в виду обещание, которое уже выполнено ни с чем (undefined
, null
).
Синтаксис jQuery для создания такого типа использует $.when
с единственным (или отсутствующим) аргументом:
if (books <= 0) return $.when(null);
Ответ 2
Вы можете вернуть разрешенное обещание: вместо
if (books <= 0) return null;
использование
if (books <= 0) return $.Deferred().resolve();
Остерегайтесь, однако, что jQuery Promise
API делает что-то удивительное: иногда он вызывает ваш done
/then
/etc. обратный вызов синхронно с done
/then
/и т.д. звоните, иногда это не так. Большинство библиотек promises гарантируют, что вызов всегда асинхронен, даже если вы вызываете done
/then
/etc. по разрешенному обещанию. jQuery нет, поэтому вы получаете тонкие отличия.
Например, этот код:
addBooks(() => console.log(1));
console.log(2);
... будет log
2
1
... если вы сделали вызов ajax, но
1
2
... если вы вернули решительное обещание.
Ответ 3
Из https://api.jquery.com/jquery.when/
Если вы не передадите ему никаких аргументов, jQuery.when()
вернет разрешенные обещания.
например.
if (books <= 0) return $.when();
и, если вам нужно передать значение undefined:
Если один аргумент передается в jQuery.when(), и он не является отсрочкой или обещанием, он будет рассматриваться как разрешенный Deferred, и любые прикрепленные к нему завершенные транзакции будут выполняться немедленно. Завершенные аргументы doneCallbacks переданы.
например. пустым массивом передается:
if (books <= 0) return $.when([]);
например. пустым объектом передается:
if (books <= 0) return $.when({});