2015-05-02 10 views
19

Mam funkcję, która zwraca obietnicę jQuery. Wygląda to tak:Zwrot pustej obietnicy

addBooks(books: Array<Books>) { 
    return $.ajax({ 
     url: '/Books/AddBooks/', 
     type: 'POST', 
     data: ko.toJSON(books), 
     contentType: 'application/json' 
    }); 
} 

ja to tak mogę ponownie użyć tej funkcji i łańcuchowe obietnica zwrotnych, takich jak:

addBooks.done(() => { alert("Books added!"); }) 

moje pytanie, co zrobić, jeśli chcę, aby wyrwać się z addBooks wcześnie i zapobiec wycieczka na serwer. Na przykład:

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' 
    }); 
} 

Mój przykład nie będzie kompilować, ponieważ mój przykuty zrobić zwrotna przykład spodziewa addBooks zwrócić przedmiot obietnicy not null. Jak mogę zwrócić pustą obietnicę (czy jakikolwiek poprawny obiekt powinienem zwrócić w tej sytuacji)?

Odpowiedz

20

Jak mogę zwrócić pustą obietnicę (czy jakikolwiek poprawny obiekt powinienem zwrócić w tej sytuacji)?

Tak, „pusta obietnica” jest tu odpowiednie, jeśli masz na myśli obietnicę, że już jest spełnione z niczym (undefined, null).

JQuery składnia do tworzenia takich używa $.when z jednym (lub nie) argumentu:

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

Nie wiedziałem o tym użyciu '$ .when', ale jest to właśnie w dokumentach! –

6

Można zwrócić rozwiązany obietnicę: Zamiast

if (books <= 0) return null; 

użycie

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

Strzeż jednak, że jQuery Promise API robi coś zaskakującego: Czasami nazywa swoje done/then/itd. wywołanie zwrotne synchronicznie z done/then/etc. zadzwoń, czasem nie. Większość obiecanych bibliotek zapewnia, że ​​wywołanie jest zawsze asynchroniczne, nawet jeśli dzwonisz pod numer done/then/etc. o rozwiązanej obietnicy. jQuery nie, więc masz subtelne różnice.

Na przykład, ten kod:

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

... zanotuje

 
2 
1 

... jeśli nie wywołania AJAX, ale

 
1 
2 

... jeśli zwróciłeś rozwiązaną obietnicę.

+0

To kompiluje, ale musiałem dodać dodatkowy kod, ponieważ typ zwracany z '$ .Deferred' różni się od zwracanego typu' $ .ajax'. Podoba mi się odpowiedź udzielona przez @Bergiego, ponieważ zawiera trochę mniej kodu. –

3

Od https://api.jquery.com/jquery.when/

Jeśli nie przekazać go w ogóle żadnych argumentów, jQuery.when() zwróci ustaloną obietnicę.

np.

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

, a jeśli potrzebna jest wartość, która nie jest niezdefiniowany przekazywane:

Jeśli pojedynczy argument jest przekazywana do jQuery.when() i jest nie odroczonej lub Obietnica, będzie traktowana jako rozstrzygnięta Odroczona, a wszystkie wykonane przydziały odsyłaczy zostaną natychmiast wykonane. W doneCallbacks przekazywane są oryginalne argumenty.

np. pusta tablica jest przekazywane:

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

np pusty obiekt jest przekazywany:

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