eventproxy如何实现重复型异步顺序执行代码?
发布于 9 年前 作者 ycczkl 5186 次浏览 最后一次编辑是 8 年前 来自 问答

题目有点绕,我来解释下。 根据文档:

重复异步协作

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],最后返回结果)?

7 回复

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

回到顶部