为什么我的回调不会附加到此承诺链的末尾?

时间:2014-02-27 22:03:23

标签: javascript jquery promise

我对此失去了理智。

我想做的就是链接一组函数(同步和异步),并在完成所有操作后进行回调。

像这样的简单链接函数

function promise_chain(fns, start) {
    return fns.reduce(function(previous, next) {
        return previous.then(next);
    }, start);
}

确实能够对事物进行排序,但我无法在我的生活中得到一个回调来触发 end 。它返回promises链中的最后一个,它应该像其他任何一个一样进行then回调。但是这样的回调会在链中的第一个项目之后被触发。

这是小提琴。

http://jsfiddle.net/v6YCL/

它还包含该链接函数的变体,它确认该链确实有一个结束回调:

// This version prints the "resolved" message at the end as expected, but
// the message sequence is otherwise the same.
function wtf_promise_chain(fns, start) {
    var _chain = $.Deferred();

    $.when(fns.reduce(function(previous, next) {
        return previous.then(next);
    }, start).
           then(function() {
               message("chain resolved");
               _chain.resolve();
           }));
    return _chain;
}

1 个答案:

答案 0 :(得分:3)

您错过了一个微妙的观点:当您明确地从then回调中返回一个承诺时,它返回的承诺依次对该值进行操作。

要获得所需的行为,您需要编写

wait(2000)
  .then(function() { starter.resolve(); return chain; })
  .then(function() { message("end, state is: " + chain.state()); });

您当前的版本(此处为了完整性而复制)读取

wait(2000)
  .then(starter.resolve)
  .then(function() { message("end, state is: " + chain.state()); });

并且starter.resolve返回starter,显然刚刚解决,第二个.then会立即打印最终消息。