我有一个按顺序执行以下操作的软件:
download text files from s3
reads the files
collect the data from files
程序是异步同步的 - 每个阶段都是异步的,但它在很大程度上取决于前一阶段的输出,所以我使用Promises来构建链接。
这个体系结构的问题是使用了很多cpu,因为我在提取和收集阶段产生了子进程。所以我决定改变事件:
我是怎么做的:
我有3个eventEmitters:downloadFile,extract,collect:
downloadfile.emit("copy", s3file);
downloadfile.on("error", callback);
downloadfile.on("close", (file) => {
extract.emit("file", file);
extract.on("error", callback);
extract.on("close", (file) => {
collect.emit("data", file.data);
collect.on("error", callback);
collect.on("close", (data) => {
data is here... i can use without waiting all the other files.
});
});
});
但这不是很易读......我更喜欢Promise方式:
Promise.resolve(options)
.then(downloadFiles)
.then(extract)
.then(collect);
所以我在想......是否有可能将这些事件联系起来?我的意思是,事件的输出将是其他的输入,就像Promises一样?如果是这样,我怎么能实现呢?