[EventProxy(二)]EventProxy之group自动排序

本文详细介绍了EventProxy中group方法的使用方式及其背后的原理。group方法确保了即使在异步调用的情况下,返回的数据仍能按照原始调用顺序排列。此外,文章还展示了如何结合after方法处理多个异步任务,并通过示例代码演示了group方法如何解决异步操作中的数据排序问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

假设你已经阅读并基本理解了EventProxy的官方说明https://www.npmjs.com/package/eventproxy,否则你有两个选择:

1、先阅读官方说明,再浏览本文

2、如果不愿意做第1条,关闭本页面去别处逛逛。

言归正传。

fail除了用于协助all方法完成外,也能协助after中的异常处理。另外,在after的回调函数中,结果顺序是与用户emit的顺序有关。为了满足返回数据按发起异步调用的顺序排列,EventProxy提供了group方法。

 

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', ep.group('got_file'));

}

group秉承done函数的设计,它包含异常的传递。同时它还隐含了对返回数据进行编号,在结束时,按顺序返回。

 

ep.group('got_file');

// 约等价于

function (err, data) {

  if(err) {

   return ep.emit('error', err);

  }

  ep.emit('got_file', data);

};

例如,假设存在文件D:\1.txt和D:\2.txt。其中1.txt是大小超过3M的长文本文件。对于以下代码,group将能按照文件读取顺序返回结果(Node已测)。

var fs=require("fs");

varEventProxy=require("eventproxy");

var ep = new EventProxy();

varfiles=["D:\\1.txt","D:\\2.txt"];

ep.after('file',files.length,function(list) {

    //'file'事件触发files.length次之后进入这里。

   for(var i=0;i<files.length;i++)

       console.log(list[i].toString());

});

for (var i = 0; i < files.length; i++) {

    //console.log("read");输出两次,尽管1.txt是大文件。

fs.readFile(files[i],'utf-8', ep.group('file'));

  //fs.readFile(files[i], 'utf-8',function(err,data){

  //   console.log(data.toString());

  //});

//fs.readFile是异步的,因为我们故意使1.txt2.txt大很多,因此读取1.txt要比2.txt耗时。由于这个原因,2.txt的回调函数将先于1.txt被调用(已测),但输出的结果显示1.txt的内容排在最前面,说明group内部的确自动为我们完成了这种排序工作。

}

当回调函数的数据还需要进行加工时,可以给group带上回调函数,只要在操作后将数据返回即可:

 

ep.group('got_file', function (data) {

  //some code

 return data;

});

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值