javascript异步编程

来源:互联网 发布:卖跑步装备的淘宝店 编辑:程序博客网 时间:2024/06/06 15:36

javascript的异步、同步、回调和时间循环等概念就不解释了,google一下,一大堆精品文章。这里简单记录一下javascript的异步编程常用套路。
就以nodejs的fs模块读取文件为例吧。

  • fs同步读取文件
var fs = require("fs");var fileContent = fs.readFileSync('test.js','utf8');console.log(fileContent);console.log("something else");
  • fs异步读取文件
var fs = require("fs");fs.readFile('async.js','utf8',function(err,data){    if(!err) {       console.log(data);    }});console.log("something else");

这个代码就是javascript中最原始的异步编程。用这种原始的方法会带来一些弊端,比如回调地狱。
为了让开发者能够优雅地写javascript代码,能工巧匠们发明了一下几种方法。

1. 将回掉函数抽离出来,也就是所谓的模块化

var fs = require("fs");fs.readFile('async.js','utf8',fileContent);function fileContent(err,data) {  if(!err) {     console.log(data);  }}

这么干也有一个弊端,就是动不动就要为回掉函数命名,很是让人头疼,你懂的。

2. 使用generator

用generator“异步转同步”的典型当属tj大神的co库。看下面代码。

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);  };}

co用起来令人费解。

3. 实用promise

q, bluebird这些库使用promise“碾平”了javascript回调函数带来的“金字塔”。

var Promise = require('bluebird'); // Converts all function of 'fs' into promises.var fs = Promise.promisifyAll(require('fs'));fs.readFileAsync('file.js','utf8').then(function(data) {  console.log(data);}).catch(function(err) {  console.log(err);});

promise很有前途。

4. 使用事件驱动(event-driven)

nodejs原生模块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');

事件驱动,大材小用了。

5. 实用Async.js库

Async.js解决异步问题“爽的”没得说。看看github上到star数就知道它不是泛泛之辈。

0 0
原创粉丝点击