仅在堆栈中的最后一个执行回调

Callback execution only on last in stack

本文关键字:最后一个 执行 回调 堆栈      更新时间:2023-11-27

目前我已经这样设置了,

var elements = $('#one, $two, #three, #four, #six');
var _temp = 0;
elements.hide(0, function(){
    /* by default, the callback will be performed to
       every single element in stack */
    _temp++; // increment temporary cache
    // perform actual callback only on last in list
    if (_temp == elements.length) {
        // do stuff
    }
});

但感觉不对,因为如果我想对下面的另一个回调241行做同样的操作,我必须重置_temp,全局变量就是一团糟。

我该如何简化它?

一种可能的方法是使用闭包:

var elements = $('#one, $two, #three, #four, #six');
elements.hide(0, (function(){
    var _temp = 0;
    return function(){
        _temp++; // increment temporary cache
        // perform actual callback only on last in list
        if (_temp == elements.length) {
            // do stuff
        }
    };
})());

如果你想更频繁地使用这种模式,你可以创建一个返回回调的函数。

还要注意,.hide()有一个持续时间作为第一个参数。

尝试在函数中使用静态变量。

还有另一种没有临时变量的方法,它可能对一些人来说可读性较差,并迫使您将选择存储在变量中,但是:

elements.hide(0, function(){
    // if last callback (compare raw DOMElements, because jQuery object aren't somehow similar)
    if ($(this)[0] === elements.last()[0]) {
        // do stuff
    }
});

缩小一些行,并完成任务。