nodejs异步编程
来源:互联网 发布:2d图像转3d算法 编辑:程序博客网 时间:2024/06/06 21:43
nodejs异步编程,老生常谈。今天总结一下,算是巩固学习吧。
以读文件为例,同步编程这么写:
var fs = require("fs");var fileContent = fs.readFileSync('sync.js','utf8');console.log(fileContent);console.log("something else");
异步编程咋整?回调函数伺候之:
var fs = require("fs");fs.readFile('async.js','utf8',function(err,data){ if(!err) { console.log(data); }});console.log("something else");
回调函数太棒了,程序可以异步了。不过回调这东西有点好过头了,当回掉函数嵌套太多时候,程序写起来相当烦人。我想每个人都知道回调地狱(callback hell)。
javascript这个又爱又恨的东西这几年发展很快,投入的很大精力去改进的东西很多东西都是为了避免回调地狱。到现在(2016-5-17),es7草案已经提出,下面我们就以es7的视野来总结一下如何避免callback hell来异步编程。
- 模块化代码
- 使用生成器
- 使用promise
- 使用时间驱动编程
- 使用Async.js
模块化代码
模块化代码其实就是将回调函数名个名字,使用回调函数时候仅仅使用名字,回掉函数的实现定义在其他地方。
这样的代码:
var fs = require("fs");fs.readFile('async.js','utf8',function(err,data){ if(!err) { console.log(data); }});
可以写成这样的:
var fs = require("fs");fs.readFile('async.js','utf8',fileContent);function fileContent(err,data) { if(!err) { console.log(data); }}
使用generator
这里暂时使用co模块提供的generator功能:
"use strict";var fs = require('fs');var co = require('co');co(function* () { var file1 = yield readFile('demo.js'); console.log(file1); console.log("I am after file read even though its Async");});function readFile(filename) { return function(callback) { fs.readFile(filename, 'utf8', callback); };}
使用promises
es5提出了promise概念。可以使用Q库或者Bluebird库提供的promise功能:
var Promise = require('bluebird'); // Converts all function of 'fs' into promises.var fs = Promise.promisifyAll(require('fs'));fs.readFileAsync('file.js','utf8')// 'then' when result comes..then(function(data) { console.log(data);})//'catch' when error comes..catch(function(err) { console.log(err);});
使用事件驱动
EventEmitter模块提供了一些关于事件操作的方法,便于编写事件驱动的程序:
var EventEmitter = require('events').EventEmitter;var emitter = new EventEmitter();var fs = require('fs');// Event to read file - generic function.emitter.on('start_read',function(file_name) { console.log("Started Reading file....\n\n"); fs.readFile(file_name, 'utf8', function (err,data) { if (err) { console.log("Error happens."); } else { console.log("File data", data); } });});// Let's read some file.emitter.emit('start_read','env.json');emitter.emit('start_read','envConfig.js');
0 0
- nodejs异步编程
- nodejs 异步编程 async
- NodeJS的异步编程风格
- NodeJS的异步编程风格
- NodeJS的异步编程风格
- nodejs之async异步编程
- nodejs之async异步编程
- NodeJS的异步编程风格
- nodejs之async异步编程
- nodejs的异步编程思想
- 深入浅出NodeJS——异步编程
- Nodejs中的异步编程类库Async
- nodejs 异步
- nodejs异步
- javascript:异步化编程,仿NodeJs的小样
- NodeJS之异步编程(一)参数传递
- nodejs学习笔记二:闭包和异步编程
- 深入浅出nodejs学习笔记——异步编程
- mdev_笔记
- 第一章、Hadoop之生态体系
- Linux 终端 使用
- Android wpa_supplicant源码分析--bss扫描结果
- Single Number II
- nodejs异步编程
- 理解Python中的with…as…语法
- 动态规划-3015-十进制转二进制
- Word2010 Error:The name in the end tag of the element must match the element type in the start tag.
- 喵帕斯喵喵
- ListNode示例
- 数据库进阶系列之一:漫谈数据库索引
- 关于购物车计算金钱的问题
- UVA_10002_Center of Masses