Javascript 是否有一种方法可以控制线性调用顺序中的承诺流?
我仍然没有严格遵守诺言。假设我有一个代码:Javascript 是否有一种方法可以控制线性调用顺序中的承诺流?,javascript,jquery,Javascript,Jquery,我仍然没有严格遵守诺言。假设我有一个代码: selected.eq(i) // blink .fadeOut( 200 ).delay( 50 ).fadeIn( 400 ) .delay( 100 ) .fadeOut( 200 ).delay( 50 ).fadeIn( 400 ); 后来我打电话给: selected.unbind('click') .promise().done(function () { se
selected.eq(i) // blink
.fadeOut( 200 ).delay( 50 ).fadeIn( 400 )
.delay( 100 )
.fadeOut( 200 ).delay( 50 ).fadeIn( 400 );
后来我打电话给:
selected.unbind('click')
.promise().done(function ()
{
selected.fadeOut(500);
});
它的工作原理是例外的——一旦闪烁完成,最后一个淡出将开始。但当我通过插件(设置为使用jQuery动画)进行闪烁时,我的整个第一部分只是一个调用:
selected.eq(i).modernBlink({
duration: 750,
iterationCount: 3,
auto: true}
);
blink的主体是:
ModernBlink.prototype._fallbackAnimation = function _fallbackAnimation( iterationCount ) {
var self = this,
duration = this.options.duration / 2;
if ( iterationCount > 0 || iterationCount === 'infinite' ) {
iterationCount = iterationCount === "infinite" ? "infinite" : iterationCount - 1;
this.el.animate( { 'opacity': 0 }, duration ).promise().done( function() {
self.el.animate( { 'opacity': 1 }, duration );
self._fallbackAnimation( iterationCount );
});
}
};
因此,它也是基于promise
的递归调用。结果是不同的——在blink
的第一次迭代之后,我的代码生效了,因为我的promise
赢了
视觉效果是——眨眼,淡出(我的部分),继续眨眼
我的问题是——如何告诉jQuery,眨眼
承诺比我的更重要
注意:我不能将第二部分直接附加到第一部分,因为它们分散在代码中,有时第一部分没有执行
闪烁的代码来自leonderijke。这里使用MB作为示例
更新:总而言之,我不知道这是否有用,但无论如何:
if (Environment.Mode=='blink') // my private settings variable
call_blink(); // part 1, presented above
call_fade_out(); // part 2, presented above
这就是为什么我不能把它们锁起来。我使用了更多类似的“配置”代码,所以我想了解它,并在这里和其他地方使用它 尝试利用该事件
JSFIDLE
替代方法;通过维护count!==0
,通过调用.stop()
,clearQueue()
设置.data()
标志来“停止”
// v2
// `d` : duration , `count` : iteration
(function ($) {
$.fn.blink = blink;
function blink(d, count) {
var el = $(this);
$.fx.interval = 0;
return el.each(function (i, elem) {
var elem = $(elem);
elem.data("count", count);
return elem.fadeTo(d, "0", "linear", function () {
elem.fadeTo(d, "1", "linear", function () {
elem.data("count", --count);
return (elem.data("count") !== 0 && !elem.data("stop")
? elem.blink(d, elem.data("count"))
: elem.stop(true, true).data("stop", false))
})
})
}).promise("fx")
};
}(jQuery));
jsiddle您需要使modernlink
返回一个承诺,表示您所追求的结果-闪烁结束。截取只在将来链接的动画是不可能的。你正在使用的插件应该返回一个承诺,或者至少提供一个回调;如果没有,你需要用另一个或叉子
在您的情况下,blink方法将需要使用以下方法重复地将自身链接到承诺:
现在,你的大局可能是这样的:
if (Environment.Mode=='blink')
var step1 = new ModernBlink()._fallbackAnimation(5);
else
var step1 = jQuery.when(undefined);
var step2 = step1.then(call_fade_out);
this.el
针对多少元素?只有1?@KevinB,这里是2或1。我的意思是在这个特定的例子中,在你的第二个例子中。插件是单独作用于每个元素,还是作为一个整体作用于所有元素。答案将影响承诺的结果。从源代码看,它似乎分别作用于每个元素。“如何告诉jQuery眨眼承诺比我的更重要?”这没有意义。承诺没有优先权,你只需要选择你想听的内容。@KevinB,在实际代码中——第一部分有时会被调用。如果它被调用,则在两个元素集合中的一个元素上调用它。代码的第二部分在这两个元素集合上被称为ALWAYS。换言之,我总是对集合进行遮光处理,有时我会闪烁集合的第一个元素。好主意,但OP正在寻找解决方案,当CSS动画不可用时,闪烁插件会返回到链接animate
调用。啊,我看到了光明——大画面中的第二个“步骤1”!非常感谢你。
// e.g.,
var selected = $("div")
, button = $("button:first")
, stop = $("button:last");
selected.on("click", function (e) {
// start `$.fn.blink` , log returned `promise` on stop
$(this).blink(750, 10).then(function (el) {
console.log(el, el.queue(), el.data());
})
});
button.on("click", function () {
// unbind `click` event
selected.unbind('click')
.promise().then(function (el) {
el.fadeOut(500);
});
});
stop.on("click", function () {
// stop animation
selected.data("count", null).data("stop", true).clearQueue()
})
ModernBlink.prototype._fallbackAnimation = function(iterationCount) {
var self = this,
duration = this.options.duration / 2;
if (iterationCount === 'infinite' || iterationCount-- > 0) {
return this.el.animate({'opacity': 0}, duration).promise()
.then(function() {
return self.el.animate({'opacity': 1}, duration).promise();
})
.then(function() {
return self._fallbackAnimation(iterationCount);
});
} else {
return this;
}
};
if (Environment.Mode=='blink')
var step1 = new ModernBlink()._fallbackAnimation(5);
else
var step1 = jQuery.when(undefined);
var step2 = step1.then(call_fade_out);