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.

Relaterte artikler