javascript 發佈訂閱

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script>
        /*
         *發佈訂閱模式
         * 存在的問題 :
         * 1  重複的訂閱
         * 2  發佈的信息不是用戶本身想要的,
         * 3  代碼結構上的問題,
         */
        var  sales={};

        // 訂閱的對象,
        sales.cache=[];

        // 監聽
        sales.listen=function (fn) {
            this.cache.push(fn);
        }

        // 發佈
        sales.trigger = function () {
            for(var i=0,fn;fn = this.cache[i++];){
                fn.apply(this,arguments);
            }
        }

        //test

        sales.listen(function (s,p) {
            console.log('sequen+'+s);
            console.log('price+'+p);
        });


        sales.trigger('200',40);
        sales.trigger('100',20);

    </script>
</head>
<body>

</body>
</html>




// 修正

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script>
    /*
    *  1 解決訂閱信息多發的狀況,
    *
    *
    * */
    
    var sales={};
    sales.cache={};
    /**
     * 監聽的時候給,監聽對象分組處理
     *
     */
    sales.listen = function (key,fn) {
        if(!this.cache[key]){
            this.cache[key] = [];
        }
        this.cache[key].push(fn);
    };


    sales.trigger = function () {
        var key = Array.prototype.shift.call(arguments);
        fns = this.cache[key];

        if(!fns || fns.length === 0)
        {
            return false;
        }

        for(var i=0,fn;fn = fns[i++];)
        {
            fn.apply(this,arguments);
        }
    }

    // listen
    sales.listen('s100',function(s,p){
        console.log('s100+'+s);
        console.log('p100+'+p)
    })

    //有訂閱,可是沒有發佈,
    sales.listen('s200',function(s,p){
        console.log('s200+'+s);
        console.log('p300+'+p)
    })


    sales.trigger('s100',100,20);

        
    </script>
</head>
<body>

</body>
</html>
相關文章
相關標籤/搜索