【发布时间】:2017-05-13 18:59:09
【问题描述】:
以下是我们如何在 jQuery(1.8 及更高版本)中链接多个 Promise 的方式吗?
foo()
.then(function() { return bar(); })
.then(function() { return wah(); })
.then(function() { return lah(); })
.then(function() { return haha(); });
所有foo()、bar()、wah()、lah()、haha() 都必须返回一个承诺。
我想一个注意点是我们必须使用then()而不是done(),因为如果我们使用done(),那么第二个动作到最后一个动作都将在动作1完成后开始,而不是一个接一个。
一个例子:https://jsfiddle.net/jq9d3tw1/
changeStyle($("#message1"), { fontSize: "3em" }, 3000)
.then(function() { return changeStyle($("#message2"), { marginLeft: "100px" }, 2000) })
.then(function() { return changeStyle($("#message3"), { opacity: 0 }, 1000) });
changeStyle() 创建一个 deferred,获取 Promise,执行一些操作并在完成时解析 Promise,然后返回该 Promise:
function changeStyle(element, style, duration) {
var d = new $.Deferred(),
p = d.promise();
element.animate(style, duration, function() {
d.resolve();
});
return p;
}
【问题讨论】:
-
看看这篇文章,它很好地解释了链接多个承诺:medium.com/coding-design/…
-
where all foo(), bar(), wah(), lah(), haha() have to return a promise- 在您发布的代码 sn-p 中,只有 foo 必须返回一个承诺,其他 可以 但它不是 对于正确的 Promise/A+ 功能是必需的——当然,一些早期的 jQuery 实现的“promise”(或者更准确地说是 jQuery,Deferred 的)并不完全符合 Promise/A(更不用说 Promise/A+)了,所以,也许你是对的,那些函数必须返回一个 Promise -
@JaromandaX 如果第二个和以后的不返回一个承诺,如jsfiddle.net/jq9d3tw1/3 使用
changeStyle2,那么动画2和3同时发生,不是一个一个 -
你误会了。我只是更正了一个不正确的一般性陈述。
-
所以你是说为了一个一个地做,倒数第二个函数不必返回一个承诺?你有这个工作的例子吗?因为jsfiddle.net/jq9d3tw1/3 没有
标签: jquery promise jquery-deferred deferred