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);
    }
  • 相关阅读:
    Web前端面试(二):CSS盒模型
    Web前端面试题
    微信小程序之base64图片如何预览与一键保存到本地相册?
    微信小程序 —搜索框
    初次
    用document.getElementsByTagName()返回的真的是数组吗?
    《精通CSS:高级Web标准解决方案》学习笔记(下)
    Git常用命令
    博客施工暂时告一段落
    《精通CSS:高级Web标准解决方案》学习笔记(上)
  • 原文地址:https://www.cnblogs.com/lyraLee/p/12096902.html
Copyright © 2011-2022 走看看