在jQuery中使用.then()链接promises / Deferreds

时间:2015-12-08 21:03:05

标签: javascript jquery asynchronous jquery-deferred

我使用的是jQuery 1.8.3我有一个返回新jQuery.Deferred()的函数。当我使用deferred.then()链接对此函数的调用时,基于文档,我希望在前面的函数返回时调用给定的函数,并接收jQuery.Deferred()作为输入。

实际上,当前一个函数jQuery.Deferred()deferred.resolve()发出信号时,会调用一个给定的函数,并接收传递给.resolve()的值。

实际行为是我想要的,但我担心我依赖于无证/不支持的行为,或者我实际上有一个错误会产生我想要的错觉。< / p>

例如,给定

function async_task(i) {
  console.log("Starting async_task(" + i + ")\n");
  var def = $.Deferred();
  setTimeout(function() {
    console.log("    finished " + i + "\n");
    def.resolve(i + 1);
  }, 1000);
  return def;
}

console.log("starting\n");
var p;
p = async_task(1);
p = p.then(async_task);
p = p.then(async_task);
p.then(function() {
  console.log("done\n");
});

输出

starting
Starting async_task(1)
    finished 1
Starting async_task(2)
    finished 2
Starting async_task(3)
    finished 3
done

但我希望

starting
Starting async_task(1)
    finished 1
Starting async_task(2)
Starting async_task([object Object])
done
    finished 2
    finished [object Object]

我当然可以想象jQuery正在探究传递给.then()的函数返回的内容,以及它是否延迟/承诺做我想要的,但我找不到支持这个想法的文档

为什么基于文档的期望与我观察到的不一致?我忽略了文档吗?这种无证的行为我不应该依赖吗?我真的有错误吗?

1 个答案:

答案 0 :(得分:4)

看起来你只是误读了docs。不可否认,他们可以写得更好。

您缺少的句子是

  

这些过滤器函数可以返回一个新值,传递给promise .done().fail()回调,或者它们可以返回另一个可观察对象(Deferred,Promise等),将其已解决/拒绝的状态和值传递给承诺的回调。

虽然jQuery没有解释得很好,但这种采用(&#34;展开&#34;)的进一步承诺实际上是杰出的features of promises之一。