我在延迟对象的链接方面遇到了一些问题。所以我认为我错过了一些理解。我的代码如下:
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(名称)功能。在AJAX_FUNC_CREATE_ALIAS(名称)完成之前,不会执行.done()方法。
它开始执行AJAX_FUNC_CREATE_ALIAS(别名);在这里它不等待从服务器得到答案。它直接进入$ .publish(....)
为什么?
更新:我添加了一些代码来检查我从问题行获得的答案。我回来的承诺似乎有“待决状态”。从jquery文档.done()方法:“添加要在解析Deferred对象时调用的处理程序”。 [http://api.jquery.com/deferred.done/]。如果状态正在等待......为什么done()方法会得到它?
答案 0 :(得分:1)
然后返回一个新的诺言,完成了不做。
如果你想连接任务,那就使用你为第二个承诺所做的事情,只为下一个承诺做同样的事情。
它写在这里: