zoukankan      html  css  js  c++  java
  • 异步并行任务实现的几种方案

    当node中异步读取文件(在所有的同步任务执行完成之后执行的任务)操作,需要并行执行完成后调用某函数:

    const fs = require('fs');
    
    let user = {}
    // 异步读取文件;文件在根目录下
    fs.readFile('1.txt', 'utf-8', function(err, data) {
      user['name'] = data;
    })
    fs.readFile('1.txt', 'utf-8', function(err, data) {
      user['age'] = data;
    })
    // 需要等待上面的两个异步任务都执行完成后再执行该方法
    function getUser() {
      console.log(user);
    }

    1. 自定义函数after

    /**
     * 
     * @param {number} timers 需要执行的次数
     * @param {function} fn 需要异步执行完成后执行的函数
     */
    function after(timers, fn) {
      return function() {
        if (--timers === 0) {
          fn();
        }
      }
    }
    const newAfter = after(2, getUser);
    
    const fs = require('fs');
    let user = {}
    // 异步读取文件;注意文件要在根目录下
    fs.readFile('1.txt', 'utf8', function(err, data) {
      if (!err) {
        user['name'] = data;
        newAfter();    
      }
    })
    fs.readFile('2.txt', 'utf8', function(err, data) {
      if(!err) {
        user['age'] = data;
        newAfter();    
      }
    })
    // 需要等待上面的两个异步任务都执行完成后再执行该方法
    function getUser() {
      console.log(user);
    }

    2. 发布订阅模式

    发布订阅模式的本质是,订阅的函数存入队列,每次发布的时候全部执行。

    // 定义一个含有发布订阅功能的对象
    const e = {
      arr: [], // 存储订阅函数
      on(fn) {// 订阅函数
        this.arr.push(fn);
      },
      emit() {// 发布函数
        this.arr.forEach(fn => fn());
      }
    }
    
    e.on(function() {
      if(Object.keys(user).length === 2) {
        getUser();
      }
    })
    
    const fs = require('fs');
    let user = {}
    // 异步读取文件;注意文件要在根目录下
    fs.readFile('1.txt', 'utf8', function(err, data) {
      if (!err) {
        user['name'] = data;
        e.emit();
      }
    })
    fs.readFile('2.txt', 'utf8', function(err, data) {
      if(!err) {
        user['age'] = data;
        e.emit();
      }
    })
    // 需要等待上面的两个异步任务都执行完成后再执行该方法
    function getUser() {
      console.log(user);
    }
  • 相关阅读:
    appium自动化测试搭建
    How to install Qt Creator on Ubuntu 18.04
    Luci
    OpenWrt 根文件系统启动过程分析
    shell 杂烩
    OpenWrt Luci 调试日志输出的一种方法
    jQuery实现购物车计算价格的方法
    js实现购物车添加,减少数量
    golang-键盘录入数据
    JAVA存储机制(栈、堆、方法区详解)
  • 原文地址:https://www.cnblogs.com/lyraLee/p/12096902.html
Copyright © 2011-2022 走看看