如果我想读取三个文件的内容并把其整合到一起后再执行操作,因为nodejs是异步的,所以如果这样写:
fs.readFile('a.txt','utf-8',function(err,data){})
fs.readFile('b.txt','utf-8',function(err,data){})
fs.readFile('c.txt','utf-8',function(err,data){})
但因为不知道哪一个最后执行完,所以操作代码不知道该加到哪一个函数中
解决这个问题的第一个方法就是加一个计数器:
var count=0
fs.readFile('a.txt','utf-8',function(err,data){
count++
if(count===3){/*执行操作*/}
})
fs.readFile('b.txt','utf-8',function(err,data){
count++
if(count===3){/*执行操作*/}
})
fs.readFile('c.txt','utf-8',function(err,data){
count++
if(count===3){/*执行操作*/}
})
第二种方法是使用eventproxy:
var eventproxy=require('eventproxy')
var ep=new eventproxy()
ep.after('icon',arrs.length,function(res){
//res是每一个ep.emit传进来的的数据的数组
})
//当icon行为执行了arrs.length次操作后执行后续操作
ep.emit('icon',data)
//data为要传进res的数据
第三种是async控制并发,可以控制并发数
async.mapLimit(items,2,function(item,callback){
//并发传入2个item进行操作
callback(null,data)
//data会传入到下一个回掉函数的result数组中
},function(err,result){})
举一个具体例子:
ar async=require('async')
var test=function(item,callback){
setTimeout(function(){
console.log(item+'ok')
callback(null,item+'result')
},2000)
}
var items=[1,2,3,4,5,7,8,9,10]
async.mapLimit(items,2,function(item,callback){
test(item,callback)
},function(err,result){
console.log(result)
})
会输出: