web-dev-qa-db-ja.com

空の約束を返す

JQuery promiseを返す関数があります。次のようになります。

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ではなくpromiseオブジェクトを返すことを想定しているため、私の例はコンパイルされません。どうすれば空のプロミスを返すことができますか(またはその状況で正しいオブジェクトを返す必要がある場合でも)。

20
Jonathan Eckman

どうすれば空のプロミスを返すことができますか(またはその状況で正しいオブジェクトを返す必要がある場合でも)。

はい、すでに何も満たされていない約束(undefinednull)を意味する場合、ここでは「空の約束」が適切です。

そのようなものを作成するjQuery構文は $.when 単一の引数(または引数なし):

if (books <= 0) return $.when(null);
25
Bergi

resolved promiseを返すことができます:代わりに

if (books <= 0) return null;

使用する

if (books <= 0) return $.Deferred().resolve();

注意ただし、jQueryのPromise AP​​Iは驚くべきことを行います。時々、done/then/etcを呼び出します。 done/then/etcと同期してコールバックします。呼び出し、時々そうではありません。ほとんどのpromiseライブラリは、done/then/etcを呼び出している場合でも、呼び出しが常に非同期であることを保証します。解決された約束。 jQueryはそうではないため、微妙な違いが生じます。

たとえば、次のコード:

addBooks(() => console.log(1));
console.log(2);

...記録します

 2 
 1 

... ajax呼び出しを行ったが、

 1 
 2 

...解決した約束を返した場合。

8
T.J. Crowder

から https://api.jquery.com/jquery.when/

引数をまったく渡さない場合、jQuery.when()は解決されたプロミスを返します。

例えば.

if (books <= 0) return $.when();

そして、未定義ではない値が渡される必要がある場合:

単一の引数がjQuery.when()に渡され、それがDeferredまたはPromise、解決された遅延として扱われ、添付されたdoneCallbacksはすぐに実行されます。 doneCallbacksには元の引数が渡されます。

例えば空の配列が渡されます:

if (books <= 0) return $.when([]);

例えば空のオブジェクトが渡されます:

if (books <= 0) return $.when({});
3
Gone Coding