题目有点绕,我来解释下。 根据文档:
重复异步协作
var ep = new EventProxy();
ep.after('got_file', files.length, function (list) {
// 在所有文件的异步执行结束后将被执行
// 所有文件的内容都存在list数组中
});
for (var i = 0; i < files.length; i++) {
fs.readFile(files[i], 'utf-8', function (err, content) {
// 触发结果事件
ep.emit('got_file', content);
});
}
根据文档我知道多个fs.readFile()函数会异步执行并且顺序不可控,当所有异步操作结束后会返回到after函数中。 如果现在我希望顺序执行多个异步操作应该怎么写呢(先读取fule[0], 然后读取file[1]…file[n-1],最后返回结果)?
wrap一个next,当next被call,执行下一个。
你可以用 asnyc.parallel() 去执行
执行一个emit一下: // var ep = new eventproxy();
ep.on(‘step1’,function(){ fs.readFile(‘file1’,function(err,content){ if(err){return} ep.emit(‘step2’); }) })
ep.on(‘step2’,function(){ fs.readFile(‘file2’,function(err,content){ if(err){return} ep.emit(‘step3’); }) })
…
ep.emit(‘step1’);
跟着写一个,这个场景用Async的eachSeries或者Promise的map也能实现。
var eventproxy = require('eventproxy');
var fs = require('fs');
var ep = eventproxy();
ep.fail(function (err) {
throw err;
});
var files = ['./resources/raw_result1', './resources/raw_result2'];
ep.on('file'+(files.length-1), function (data) {
console.log(data.toString());
console.log('done');
});
for (var i=files.length-1; i>0; i--) {
ep.on('file'+(i-1), (function(i) {
return function (data) {
console.log(data.toString());
fs.readFile(files[i], ep.done('file'+i));
}
})(i));
}
fs.readFile(files[0], ep.done('file'+0));
@2yuri 这个方法不太优雅。 如果我step数量不确定呢
@albin3 懂了 谢谢
@ycczkl 只是提供思路,done和fail实现方式其实是一样的,只是封装了一下callback