Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/88.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 是否有一种方法可以控制线性调用顺序中的承诺流?_Javascript_Jquery - Fatal编程技术网

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);