回調(diào)對象 $.Callbacks()

// 正常寫法
    /*function A(list, cb) {
        setTimeout(function() {
            var task = list.shift();
            task(); //執(zhí)行函數(shù)

            if (list.length > 0) {
                setTimeout(arguments.callee, 100);  // 遞歸分解
            } else {
                cb();
            }
        }, 30);

    }

    A([function() {
        console.log('first');
    }, function() {
        console.log('second');
    }], function() {
        console.log('callback');
    });*/


    let cb = $.Callbacks('once');
    // once的使用是使隊列只執(zhí)行一次
    // add參數(shù)可以是函數(shù)或函數(shù)數(shù)組
    cb.add([function() {
        console.log('a');
    }, function() {
        console.log('b');
    }]);

    cb.fire();  // 執(zhí)行了once,后面的就不再觸發(fā)
    /*
        這是在fire的時候執(zhí)行了,self.disable
        disable: function() {
            list = stack = memory = undefined;
            return this;
        }
    */
    cb.add(function(){alert(1)});
    cb.fire();


    // demo
    function fn1(val) {
        console.log(val);
    }

    function fn2() {
        console.log('say hi ');
        return false;
    }

    function test() {
        console.log('雙擊屏幕,666');
    }

    let callbacks = $.Callbacks('memory');

    callbacks.add(fn1);
    callbacks.fire('你好');
    callbacks.add(test);
    callbacks.add(function(){console.log('一枝梅')})
    callbacks.add(fn2); // memory 即使在沒有fire的情況,后添加到列表中的函數(shù)也能執(zhí)行
    /*
        就是fn2這個函數(shù)會存儲在memory變量中,然后再統(tǒng)一執(zhí)行這時memory是這樣的[fn1, test, 匿名函數(shù), fn2]
    */


    let cbs = $.Callbacks('unique');    // 相同函數(shù),防止重復(fù)添加
    cbs.add(test);
    cbs.add(fn2);
    cbs.add(test);
    cbs.fire();
    /*
        if ( !options.unique || !self.has(arg)) {   // 確保是否可以重復(fù)
            list.push(arg);
        }
    */


    let calls = $.Callbacks('memory stopOnFalse');  // stopOnFalse 遇到函數(shù)里return false了,之后的列表就不再添加
    calls.add(test);
    calls.add(fn2);
    calls.fire();

    calls.add(function(){console.log('春江水')});

    // 常規(guī)的發(fā)布訂閱
    let Observe = {
        callbacks: [],
        add: function(fn) {
            this.callbacks.push(fn)
        },
        fire: function() {
            this.callbacks.forEach(fn => fn());
        }
    };

    // Observe.add(function(){console.log('Jocker')});
    // Observe.add(function() { console.log('mover like this')})
    // Observe.fire()
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容