美文网首页日常刻书
多异步之间的协作

多异步之间的协作

作者: F_wind | 来源:发表于2021-01-03 21:20 被阅读0次

    《深入浅出 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
    

    相关文章

      网友评论

        本文标题:多异步之间的协作

        本文链接:https://www.haomeiwen.com/subject/ojppoktx.html