2014-03-28 37 views
0

我有延期對象的鏈接的一些問題。所以我認爲我缺少一些理解。我的代碼是一樣的東西如下:Javascript - 承諾問題,然後()和完成()鏈中的方法

var AJAX_FUNC_CREATE_ALIAS = function(){ 

    return $.when(ajax_call()).then(function(response){ 
     // DO something with the response I get to compose an object 
     return composed_response; 
    }); 
} 


var name = 'Alejandro', 
    alias = 'Ali'; 

$.when(AJAX_FUNC_CREATE_NAME)).then(function(response, status, jqXHR){ 
     return AJAX_FUNC_CREATE_ALIAS(name); // <-- Wait correctly 
    },function(jqXHR, status, errorThrown){ 
     return default_response; 
}).done(function(artist_response){ 
    var promise = AJAX_FUNC_CREATE_ALIAS(alias); // <----- Problematic one 
    console.log(promise.state()); // It shows pending state 

    return promise; 
}).done(function(alias_response){ 
    $.publish(channel, [alias_response]) 
}); 

執行是這樣的:

  • 的AJAX_FUNC_CREATE_NAME功能開始執行。完成後,它轉到在then()中定義的回調。

  • 它執行AJAX_FUNC_CREATE_ALIAS(name)函數。在AJAX_FUNC_CREATE_ALIAS(name)完成之前,.done()方法不會執行。

  • 它開始執行AJAX_FUNC_CREATE_ALIAS(別名);在這裏它不會等待從服務器獲得答案。它直接到$ .publish(....)

爲什麼?

更新:我添加了一些代碼來檢查我從問題行中得到的答案。我得到的承諾似乎有'未決狀態'。從jquery文檔.done()方法:「添加處理程序以便在解析Deferred對象時調用。」 [http://api.jquery.com/deferred.done/]。如果狀態爲掛起......爲什麼done()方法獲取它?

+0

什麼是'。然後(功能(響應){ 返回響應; })'該怎麼辦?它只是應該省略 – Bergi

+0

@Bergi我已經改變了一點點的代碼,以反映我在那裏做了一些處理。對不起......我應該從一開始就把它放在......這只是爲了節省線條。 – kitimenpolku

回答

1

然後返回一個新的承諾,完成不。

如果你想連鎖任務使用then.that是你做了第二個承諾,它只是有意義的做同樣的下一個。

這是寫在這裏:

http://api.jquery.com/deferred.then

+0

是否有問題的AJAX_FUNC_CREATE_ALIAS(別名)也返回一個承諾?如果您檢查AJAX_FUNC_CREATE_ALIAS()函數,它將使用then()進行處理,並在得到答案時返回結果。 ??? – kitimenpolku

+0

AJAX_FUNC_CREATE_ALIAS需要返回一個承諾,否則它將無法工作。 – mpm

+0

謝謝你的回答@mpm。是不是我的函數返回一個Promise?在執行函數時,我返回這個$ .when(ajax_call())。是否它返回一個承諾?http://api.jquery.com/jQuery.when/ – kitimenpolku