【问题标题】:Chaining promises/Deferreds with .then() in jQuery在 jQuery 中使用 .then() 链接承诺/延迟
【发布时间】:2023-03-18 21:08:01
【问题描述】:

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

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

实际行为是我想要的,但我担心我依赖于未记录/不受支持的行为,或者我实际上有一个错误,造成了我想要的错觉。

例如,给定

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() 的函数返回的内容,以及是否是延迟/承诺做我想做的事情,但我找不到支持该想法的文档。

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

【问题讨论】:

  • 你的意思是.then()而不是.next()
  • GregL:你说得对,谢谢。我已经修好了。尴尬,因为代码示例是正确的,所以至少有时我写的东西是正确的。

标签: javascript jquery asynchronous jquery-deferred


【解决方案1】:

看来您只是误读了docs。诚然,它们可以写得更好。

你错过的句子是

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

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

【讨论】:

  • 我很确定 that page 的早期版本,或者 jQuery 站点中的其他地方更能说明问题。不然我怎么学的?几乎扔掉的话“......或者他们可以返回另一个可观察对象(Deferred,Promise等),它将其已解决/拒绝状态和值传递给承诺的回调”确实不足以说明这一点非常重要。
猜你喜欢
  • 1970-01-01
  • 2011-07-23
  • 2015-03-27
  • 2023-03-21
  • 1970-01-01
  • 2016-12-08
  • 2017-04-26
相关资源
最近更新 更多