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

Верните пустое обещание

У меня есть функция, которая возвращает обещание 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. Как я могу вернуть пустое обещание (или какой бы правильный объект мне не вернул в ситуации)?

4b9b3361

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