【发布时间】:2014-07-30 08:53:36
【问题描述】:
我使用 jQuery promises 运行多个动画并在它们完成后执行一些操作:
$.when(foo(),
bar(),
baz())
.done(allDone);
每个函数(foo 等)都返回一个 jQuery.Promise()。
现在说我想包含一个不为任何东西设置动画的函数,但它的时间与动画有关 - 我不能将它包含在链中,因为它不返回承诺。
所以我可以这样破解它:
function qux() {
if (something) {
return $(".whatever")
.removeClass("bob")
.addClass("fred")
.append(/*...do stuff...*/)
.animate({ left: "+=0" }, 0, callback ) // <-- dummy animation does nothing
.promise(); // <-- this is a dummy promise
}
else {
return $().promise(); // <-- this is an "empty" promise
}
}
现在我可以链接它了:
$.when(foo(),
bar(),
baz(),
qux())
.done(allDone);
这行得通。但我在这里违反了规则 - 是否有任何我没有考虑到的陷阱,或者我以某种方式踩到了 fx 队列?
更新
根据下面的答案,qux() 函数可以重写为:
function qux() {
if (something) {
$(".whatever")
.removeClass("bob")
.addClass("fred")
.append(/*...do stuff...*/);
}
}
【问题讨论】:
-
是的,它适用于多参数情况,也适用于 Bluebird 等真正的 Promise 或使用
Promise.all的原生 Promise。 -
如果我是你,我仍然会返回一个空的承诺,一个函数应该总是返回一个承诺或不返回。在我看来,不这样做是一个不一致的接口,因为调用它应该总是代表一个异步操作。
-
@BenjaminGruenbaum 检查编辑,你的意思是这样吗?
-
这绝对不是我的意思。我的意思是我不会返回
undefined。qux应该总是返回一个承诺,承诺的类型应该取决于它的作用。就像在您的初始版本中一样(else是多余的)。
标签: javascript jquery promise jquery-deferred