【发布时间】:2014-03-28 08:04:32
【问题描述】:
我在延迟对象的链接方面遇到了一些问题。所以我认为我缺少一些理解。我的代码如下:
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(alias);在这里,它不等待从服务器获得答案。它直接进入 $.publish(....)
为什么?
更新:我添加了一些代码来检查我从有问题的行中得到的答案。我回来的承诺似乎有“待定状态”。来自 jquery 文档 .done() 方法:“添加处理程序以在解析 Deferred 对象时调用。” [http://api.jquery.com/deferred.done/]。如果状态处于等待状态...为什么 done() 方法得到它?
【问题讨论】:
-
.then(function(response){ return response; })应该做什么?它应该被省略 -
@Bergi 我已经更改了一点代码以反映我在那里进行了一些处理。抱歉……我其实应该从一开始就说的……只是为了省台词。
标签: javascript jquery jquery-deferred