《深入浅出 Node.js》阅读随笔
Node.js 的中发布/订阅模式,一般用于解决一次发布对应多次订阅的情况。但在实际业务场景中,可能会存在多个发布对应一次订阅的情况,也就是多个有关联的异步任务之间的协作。比如有 A、B、C 三个任务。当它们都执行完毕之后,再执行一个最终的任务。下面我们通过一个简单的例子,来实现多异步协作的功能:
const { EventEmitter } = require("events");
const task = new EventEmitter();
/**
* 执行最终任务
*/
const finishTask = (list) => {
console.log("finish task list:", list);
};
/**
* 一个用于辅助调度的偏函数
* @param {*} times 异步任务的数量
* @param {*} callback 回调
*/
const after = (times, callback) => {
let count = 0,
result = {};
return (key, value) => {
result[key] = value;
count++;
if (count === times) {
callback(result);
}
};
};
// 执行一次任务
const run = after(3, finishTask);
// 订阅任务
task.on("run", run);
/**
* 任务 A ,耗时 1 秒
*/
const A = () => {
setTimeout(() => {
console.log("run task A");
// 发布任务 A
task.emit("run", "A", "taskA");
}, 1000);
};
/**
* 任务 B ,耗时 1.5 秒
*/
const B = () => {
setTimeout(() => {
console.log("run task B");
// 发布任务 B
task.emit("run", "B", "taskB");
}, 1500);
};
/**
* 任务 C ,耗时 2.5 秒
*/
const C = () => {
setTimeout(() => {
console.log("run task C");
// 发布任务 C
task.emit("run", "C", "taskC");
}, 2500);
};
A(); // 执行任务 A
B(); // 执行任务 B
C(); // 执行任务 C
网友评论