javascript - Returner et tomt løfte
Jeg har en funksjon som returnerer et jQuery-løfte. Den ser slik ut:
addBooks(books: Array<Books>) {
return $.ajax({
url: '/Books/AddBooks/',
type: 'POST',
data: ko.toJSON(books),
contentType: 'application/json'
});
}
Jeg gjør dette slik at jeg kan gjenbruke denne funksjonen og kjede promise-callbacks som:
addBooks.done(() => { alert("Books added!"); })
Mitt spørsmål er, hva om jeg vil bryte ut av addBooks tidlig og forhindre en tur til serveren. For eksempel:
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'
});
}
Mitt eksempel vil ikke kompilere fordi mitt kjedede done-callback-eksempel forventer at addBooks returnerer et promise-objekt, ikke null. Hvordan kan jeg returnere et tomt promise (eller hva enn det riktige objektet er jeg bør returnere i denne situasjonen)?
Svar #1
Hvordan kan jeg returnere et tomt løfte (eller hva enn det riktige objektet er jeg bør returnere i situasjonen)?
Ja, et "tomt løfte" er passende her, hvis du mener et løfte som allerede er oppfylt med ingenting (undefined, null).
jQuery-syntaksen for å opprette slikt er å bruke $.when med ett enkelt (eller ingen) argument:
if (books <= 0) return $.when(null);
Svar #2
Du kan returnere et oppløst løfte: I stedet for
if (books <= 0) return null;
bruke
if (books <= 0) return $.Deferred().resolve();
Vær forsiktig, men, for jQuerys Promise-API gjør noe overraskende: Noen ganger kaller den din done/then/osv. callback synkront med done/then/osv.-kallet, noen ganger gjør den det ikke. De fleste promise-biblioteker sørger for at kallet alltid er asynkront, selv om du kaller done/then/osv. på et løst promise. jQuery gjør ikke det, så du får subtile forskjeller.
For eksempel, denne koden:
addBooks(() => console.log(1));
console.log(2);
...vil logge
2
1
...hvis du gjorde ajax-kallet, men
1
2
...hvis du returnerte et løst løfte.
