【问题标题】:Javascript - Issue with promises, then() and done() methods in chainJavascript - 链中的 Promise、then() 和 done() 方法的问题
【发布时间】: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


【解决方案1】:

然后返回一个新的承诺,完成不。

如果你想链接任务使用 then。这就是你为第二个承诺所做的,只有对下一个做同样的事情才有意义。

写在这里:

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

【讨论】:

  • 是否有问题的 AJAX_FUNC_CREATE_ALIAS(alias) 也返回了一个承诺?如果您检查 AJAX_FUNC_CREATE_ALIAS() 函数,它会使用 then() 进行处理,并在我得到答案时返回结果。 ???
  • AJAX_FUNC_CREATE_ALIAS 需要返回一个承诺,否则它将不起作用。
  • 感谢您的回答@mpm。我的函数不是返回一个 Promise 吗?执行该函数时,我将返回此 $.when(ajax_call())。不就是回报承诺吗?api.jquery.com/jQuery.when
  • @kitimenpolku:是的,但done 不处理。
猜你喜欢
  • 1970-01-01
  • 2017-06-08
  • 2022-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-02
  • 1970-01-01
  • 2018-05-13
相关资源
最近更新 更多