日常刻书

多异步之间的协作

2021-01-03  本文已影响0人  F_wind

《深入浅出 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
上一篇下一篇

猜你喜欢

热点阅读