美文网首页
3将工作添加到事件队列

3将工作添加到事件队列

作者: zelo | 来源:发表于2017-09-28 09:42 被阅读19次

    当你创建Node.js应用和设计代码时,要利用事件模型的可拓展性和性能,要确保把工作分解成可以作为一系列的回调来执行的块。

    当你正确的设计代码时,可以使用事件模式来在事件队列上调度工作。在Node.js应用程序中,你可以使用下列办法传递回调函数来在事件队列中调度工作:

    1. 对阻塞I/O库调用之一做出调用,如写入文件或连接到一个数据库。
    2. 对内置的事件,如http.request 或server.connection添加一个事件监听器。
    3. 创建自己的事件发射器并对他们添加自定义的监听器
    4. 使用process.nextTick选项来调度在事件循环的下一次循环中被提取出来的工作
    5. 使用定时器调度在特定的时间数量或每隔一段时间后要做的工作。

    实现定时器

    1. 用超时时间来延迟工作
    setTimeout(myFunc, 1000);
    

    1秒后执行myFunc()

    1. 用时间间隔执行定时工作

    每秒执行一次myFunc()

    setInterval(myFunc,1000);
    
    1. 使用即时计时器立即执行工作
      你可以使用Node.js中内置的setImmediate(callback,[args])方法创建即时计时器。当调用setImmediate()时回调函数被放置在事件队列中,并在遍历事件队列循环的每次迭代中,在I/O事件有机会被调用后弹出一次
    setImmediate(myFunc(),1000);
    
    myImmediate= setImmediate(myFunc);
    clearImmediate(myImmediate);
    

    从事件中取消定时器引用

    myInterval = setInterval(myFunc);
    myInterval.unref();
    
    

    使用netTick来调度工作

    在事件队列上调度工作的一个非常有用的方法是使用process.nextTick(callback)函数。此函数调度要在事件循环的下一个循环中运行的工作。不想setImmediate()方法,nextTick()在I/O事件被触发之前知行。这可能会导致I/O事件的饥饿,所以Node.js通过默认值为1000的process.maxTickDepth来限制事件队列的每次循环可执行的nextTick()事件的数目。

    var fs = require("fs");
    fs.stat("nexttick.js",function(err,stats){
       if(stats) {console.log("nexttick.js Exists");}
    });
    setImmediate(function(){
        console.log(Immediate Timer 1 Executed);
    });
    setImmediate(function(){
        console.log(Immediate Timer 2 Executed);
    });
    
    process.nextTIck(function(){
        console.log("Next Tick 1 Executed");
    })
    process.nextTIck(function(){
        console.log("Next Tick 2 Executed");
    })
    
    

    实现事件发射器和监听器

    将自定义事件添加到JavaScript对象

    事件使用一个EcentEmitter对象来发出。这个对象包含在events模块中。emit(eventName,[args])函数出发eventName事件,包括所提供的任何参数。如下

    var events = require('events');
    var emitter = new events.EventEmitter();
    emitter.emit("simpleEvent");
    
    //事件添加到JavaScript对象
    Function MyObj(){
        Events.EventEmitter.call(this);
    }
    MyObj.prototype._proto_=events.EventEmitter.protoype;
    //触发事件
    var myObj = new MyObj();
    myObj.emit("someEvent");
    

    把事件监听器添加到对象

    1. addListener(eventName, callback):将回调函数俯角到对象的监听器中。每当eventName事件被触发时,回调函数就被放置在事件队列中知行。
    2. .on(eventName,callback): 同addListener
    3. .once(eventName,callback): 只有eventName事件第一次被触发时回调函数才被放置在事件队列中知行。
    function myCallback(){
        ...
    }
    var myObject = new MyObj();
    myObject.on("someEvent",myCallback);
    

    从对象中移除监听器

    监听器非常有用 但他们会导致开销,应该只在必要的时候使用它们,Node.js在EventEmitter对象上提供了多个辅助函数来让你管理包含的监听器。

    1. .listeners(eventName): 返回一个连接到eventName事件的监听器函数的数组
    2. .setMaxListeners(n):如果多于n的监听器都加入到EventEmitter对象,就会触发警报。n默认值为10;
    3. .removeListener(eventName,callback): 将callback函数从EventEmitter对象的eventName事件中删除。

    企业级独立部署应用:知行办公http://zx.naton.cn
    【总监】十二春秋之,3483099@qq.com
    【Master】zelo,616701261@qq.com
    【运营】运维艄公,897221533@qq.com
    【产品设计】流浪猫,364994559@qq.com
    【体验设计】兜兜,2435632247@qq.com
    【iOS】淘码小工,492395860@qq.com;iMcG33K,imcg33k@gmail.com
    【Android】人猿居士,1059604515@qq.com;思路的顿悟,1217022114@qq.com
    【java】首席工程师MR_W,feixue300@qq.com
    【测试】土镜问道,847071279@qq.com
    【数据】fox009521,42151960@qq.com
    【安全】保密,你懂的。

    相关文章

      网友评论

          本文标题:3将工作添加到事件队列

          本文链接:https://www.haomeiwen.com/subject/ohlmextx.html