2015-05-02 243 views
19

我有一個函數返回一個jQuery的承諾。它看起來像這樣:返回空承諾

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。我該如何回覆一個空的承諾(或者在這種情況下我應該返回哪個正確的對象)?

回答

20

如何返回一個空承諾(或任何正確的對象是我應該返回的情況下)?

是,一個「空洞的承諾」是適當的在這裏,如果你的意思是已經一無所有(undefinednull)履行的承諾。

jQuery的語法來創建這樣使用$.when用單(或沒有)的說法:

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

我不知道'$ .when'的這種用法,但它正好在文檔中! –

6

您可以返回解決承諾:與其

if (books <= 0) return null; 

使用

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

謹防,雖然,jQuery的Promise API做了令人驚訝的:有時它要求你done/then /等。與done/then/etc同步回調。打電話,有時不會。大多數承諾庫確保呼叫始終是異步的,即使您打電話給done/then/etc。在一個解決的承諾。 jQuery不會,所以你會得到微妙的差異。

例如,下面的代碼:

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

...將登錄

 
2 
1 

...如果你做的Ajax調用,但

 
1 
2 

...如果你回覆了一個解決的承諾。

+0

這個編譯,但我不得不添加額外的代碼,因爲'$ .Deferred'的返回類型不同於'$ .ajax'的返回類型。我喜歡@Bergi給出的答案,因爲它的代碼少一點。 –

3

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

如果你完全不傳遞任何參數,jQuery.when()將返回已解決的承諾。

例如,

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

,如果你需要的是不屬於undefined傳遞的值:

如果單個參數傳遞給jQuery.when(),它是不是遞延或Promise,它將被視爲已解決的Deferred,並且任何doneCallbacks附加將立即執行。 doneCallbacks傳遞了原始參數。

例如,一個空陣列被傳遞:

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

例如,一個空對象被傳遞:

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