Javascript - 链中的promises,then()和done()方法的问题

时间:2014-03-28 08:04:32

标签: javascript jquery jquery-deferred

我在延迟对象的链接方面遇到了一些问题。所以我认为我错过了一些理解。我的代码如下:

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()方法会得到它?

1 个答案:

答案 0 :(得分:1)

然后返回一个新的诺言,完成了不做。

如果你想连接任务,那就使用你为第二个承诺所做的事情,只为下一个承诺做同样的事情。

它写在这里:

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