• 简单事件模型,JS防止单个函数异步重复调用


    function Emitter(){
    	this._listener = [];
    }
    
    Emitter.prototype.bind = function(eventName, callback){
    	let listener = this._listener[eventName] || [];
    
    	listener.push(callback);
    	this._listener[eventName] = listener;
    }
    
    Emitter.prototype.trigger = function(eventName){
    	//args为了获取eventName后面的参数(注册事件的参数)
    	let args = Array.prototype.slice.apply(arguments).slice(1);
    	let listener = this._listener[eventName];
    
    	if (!Array.isArray(listener)) {
    		return;
    	}
    
    	listener.forEach(function(callback){
    		try{
    			callback.apply(this, args);
    		}catch(e){
    			console.error(e);
    		}
    	});
    }
    
    let emitter = new Emitter();
    emitter.bind("myEvent", function(arg1, arg2){
    	console.log(arg1, arg2);
    });
    
    emitter.bind("myevent", function(arg1, arg2){
    	console.log(arg1, arg2);
    });
    
    emitter.trigger("myevent", "a", "b");


    var status = "ready";
    var doSomething = function (callback) {
        emitter.bind("selected", callback);
        console.log("add a listener!");
        if (status === "ready") {
            status = "pending";
            setTimeout(function () {
                emitter.trigger("selected");
                status = "ready";
                console.log("resolved");
            }, 1000);
        };
    };
    
    //模拟并发请求
    for (var i = 0; i < 20; i++) {
        setTimeout(function (i) {
            return (function (i) {
                doSomething(function () {
                    console.log(i)
                });
            })(i)
        }, 100 * i, i);
    };
    

      


      

  • 相关阅读:
    pch文件
    Info.plist常见的设置
    通知机制
    UITextField
    通过代码自定义cell(cell的高度不一致)
    Cell的重用原理
    UITableViewCell的contentView
    2019备考[嵌入式系统设计师]之“接口技术(上)”
    shell输入输出重定向问题
    [无私分享]最新网盘资源搜索站点
  • 原文地址:https://www.cnblogs.com/KruceCoder/p/9086741.html
Copyright © 2020-2023  润新知