美文网首页NodeJS in LNNM技术文技术
Nodejs: 不借助框架,如何最简单有效的实现异步编程 [简约

Nodejs: 不借助框架,如何最简单有效的实现异步编程 [简约

作者: Tulayang | 来源:发表于2015-04-14 17:18 被阅读2573次

本文探讨利用原生机制,来最快速简单的实现异步事件流。这个傻瓜化的宗旨,是来自要面对的很实际的问题:

事件1 → 事件2 → 事件3 → 事件4 → 事件5 → 事件6 → ...

运行任务1,当任务1完成时触发事件2运行任务2,当任务2完成时触发事件3运行任务3,...

为了说明所采用的方式,使用一个很家常的任务示例:

→ 'open' 打开/home/xiaoming/myread.txt文件,获取文件描述符fd

→ 'read' 通过fd,读取该文件内最多90个字节的字符,写入到缓冲区buffer

→ 'write' 向缓冲区buffer追加1234567890字符串,通过fd,写回文件100个字符(覆盖)

→ 'close' 关闭文件描述符fd

→ 'error' 期间发生错误,打印错误

→ 'done' 全部完成,打印'Open Read Write Close ok.'

以上每个任务都是异步的,上一个完成运行下一个。
以下是源代码,不言自明。

  • 为了举例方便,这部分代码并不算完整,比如字节读写检查,错误释放fd...并未加入
  • 使用这个原生方式,可以使你最快速的上手异步事件编程
  • new (require('events').EventEmitter)()可以创建一个nodejs事件对象,拥有on, emit等事件管理方法,详细内容可以查看文档
  • on(事件类型, callback)
  • emit(事件类型, 参数1, 参数2, 参数3, ...)
  • Buffer是nodejs读写数据的内存缓冲区的一个抽象,一种表示方式
  • 缓冲区?向操作系统内存申请一片区域,用来存放数据,每隔一段时间,或者强制调用系统fsync(),将内存中的数据写到磁盘

var myemitter = new (require('events').EventEmitter)(),
    fs        = require('fs'),
    filepath  = '/home/xiaoming/myread.txt',
    buflen    = 100,
    buffer    = new Buffer(buflen);

myemitter
    .on('open', function () {
        fs.open(filepath, 'a+', function (err, fd) {
            if (err)
                myemitter.emit('error', 'open', err);
            else
                myemitter.emit('read', fd);
        });
    })
    .on('read', function (fd) { 
        fs.read(fd, buffer, 0, buflen - 10, 0, function (err, bytesRead, buffer) {
            if (err)
                myemitter.emit('error', 'read', err);
            else
                myemitter.emit('write', fd);
        });
    })
    .on('write', function (fd) {
        buffer.write('1234567890', buflen - 10);
        fs.write(fd, buffer, 0, buflen, 0, function (err, written, buffer) {
            if (err)
                myemitter.emit('error', 'write', err);
            else
                myemitter.emit('close', fd);
        });
    })
    .on('close', function (fd) {
        fs.close(fd, function (err) {
            if (err)
                myemitter.emit('error', 'close', err);
            else
                myemitter.emit('done');
        })
    })
    .on('error', function (type, err) {
        console.log('Has some error. type: "%s", error: %j.', type, err);
    })
    .on('done', function () {
        console.log('Open Read Write Close ok.');
    })
    .emit('open')
    ;

相关文章

  • Nodejs: 不借助框架,如何最简单有效的实现异步编程 [简约

    本文探讨利用原生机制,来最快速简单的实现异步事件流。这个傻瓜化的宗旨,是来自要面对的很实际的问题: 为了说明所采用...

  • 显式使用线程实现异步编程

    显式使用线程实现异步编程 摘要 本章主要讨论如何显式的使用线程实现异步编程,这其中包含如何显式使用线程实现异步编程...

  • nodeJS回调函数

    NodeJS异步编程的直接体现就是回调函数。 异步编程依托于回调来实现,但不能说使用了回调后程序就异步化了。回调函...

  • 实现一个简单的Promise/Deferred框架

    利用nodejs的event模块,可以实现一个最简单的Promise/Deferred框架: Promise De...

  • 回调函数

    nodejs异步编程的体现就是回调异步编程依托于回调来实现,但不能说使用了回调后程序就异步化了。回调函数在完成任务...

  • 5 Nodejs Koa、Koa2框架

    基于nodejs的web框架: Express框架[底层封装http模块,基于ES3/5,实现异步需大量回调,即使...

  • 八(1)、Promise(周) ------ 2020-02-2

    1、什么是Promise: 2、通过原生JS实现简单的Promise原理,理解Promise如何管控异步编程: 3...

  • Java8异步编程-CompletableFuture

    异步编程的难点 如何优雅地实现异步编程一直都是一个难题,异步编程的通常做法就是采用callback的方法,但是这种...

  • Java8异步编程-CompletableFuture

    异步编程的难点 如何优雅地实现异步编程一直都是一个难题,异步编程的通常做法就是采用callback的方法,但是这种...

  • NodeJS——异步编程

    1. 回调:通常用来处理一次性响应事件。(如指定一个回调函数来确定如何处理数据库查询结果)2. 事件监听:通常用来...

网友评论

  • 素材火:2017最全最新nodejs视频教程集合附带源码和笔记 分享给大家 http://www.sucaihuo.com/video/135.html
  • LostAbaddon:@Gnat 这个其实就是利用Webkit做了一个本地窗口,从而可以做显示用。因为原本的NODE.JS不能直接输出到屏幕啊,而要用网页的形式的话,就需要网络协议,总归是绕了一点。直接和WEBKIT绑定后,就可以直接用NODE.JS在WEBKIT的SCREEN上进行绘制了。
    当然,这也不是唯一的为Node.js加屏的方案,记得有人是将MFC和node.js结合的,不过似乎惨不忍睹的样子。。。
  • district10:@LostAbaddon 不太明白,似乎是说用浏览器的引擎打包做原生APP== 以后在了解
  • LostAbaddon:@Gnat node.js+webkit其实就是用前者做M和C,后者做V,直接可以做可视化应用了。
    这样的话你就是用webgl也可以在本地做成独立APP。

    Three.js以前研究过一阵子,做各种立体动画特效的。
  • district10:@LostAbaddon webkit。。。又不是什么技术路线。。。 :mask: 反正要标准化。。。

    外,我看好 html5 和 webgl 的数据可视化,什么 three.js, d3.js 都叼到逆天
  • LostAbaddon:@Gnat 我个人最看好node.js+webkit这个流派,不过一直没机会做点什么好玩的东西出来。。。
  • district10:最近在弄网站,用了 koa,socket.io(用起来和你这个例子很像),又在看了关于 js6,js7 的一个演讲,感觉这货简直要逆天。

本文标题:Nodejs: 不借助框架,如何最简单有效的实现异步编程 [简约

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