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オブジェクトを返すことを想定しているため、私の例はコンパイルされません。どうすれば空のプロミスを返すことができますか(またはその状況で正しいオブジェクトを返す必要がある場合でも)。
どうすれば空のプロミスを返すことができますか(またはその状況で正しいオブジェクトを返す必要がある場合でも)。
はい、すでに何も満たされていない約束(undefined
、null
)を意味する場合、ここでは「空の約束」が適切です。
そのようなものを作成するjQuery構文は $.when
単一の引数(または引数なし):
if (books <= 0) return $.when(null);
resolved promiseを返すことができます:代わりに
if (books <= 0) return null;
使用する
if (books <= 0) return $.Deferred().resolve();
注意ただし、jQueryのPromise
APIは驚くべきことを行います。時々、done
/then
/etcを呼び出します。 done
/then
/etcと同期してコールバックします。呼び出し、時々そうではありません。ほとんどのpromiseライブラリは、done
/then
/etcを呼び出している場合でも、呼び出しが常に非同期であることを保証します。解決された約束。 jQueryはそうではないため、微妙な違いが生じます。
たとえば、次のコード:
addBooks(() => console.log(1));
console.log(2);
...記録します
2 1
... ajax呼び出しを行ったが、
1 2
...解決した約束を返した場合。
から 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({});