美文网首页
异步函数

异步函数

作者: storyWrite | 来源:发表于2021-11-23 20:22 被阅读0次

    0.为什么使用异步

    因为js本身是单线程,如果所有的任务都是同步的,那么一些非常耗时的任务就会严重影响到用户体验

    1. 回调函数

    const fs = require('fs');
    
    function read(fileName) {
      fs.readFile(fileName, 'utf-8', (err, data) => {
        if (err) {
          console.log('err', err);
          throw new Error('文件读取出错');
        } else {
          console.log('data', data);
        }
      });
    }
    try {
    // 无test1.txt 文件  报错 但是无法捕获
      read('./test1.txt');
    // read(__dirname + '/test.txt)
    } catch (error) {
      console.log('err', error);
    }
    

    缺点:

    • 无法捕获异常,无法return返回读取结果
    • 会造成回调地狱
    • 效率低
    • 如果使用 runcode运行代码则需要使用 __dirname 拼接上文件名

    解决

    • 通过发布订阅
    const evnEmiter = require('events');
    const dataObj = {};
    const eve = new evnEmiter();
    eve.on('ready', (key, value) => {
      dataObj[key] = value;
      if (Object.keys(dataObj).length === 2) {
        console.log('数据获取成功', dataObj);
      }
    });
    fs.readFile(__dirname + '/test.txt', 'utf-8', (err, data) => {
      if (err) {
        console.log('err', err);
        throw new Error('文件读取出错');
      } else {
        eve.emit('ready', 'data1', data);
      }
    });
    fs.readFile(__dirname + '/trst1.txt', 'utf-8', (err, data) => {
      if (err) {
        console.log('err', err);
        throw new Error('文件读取出错');
      } else {
        eve.emit('ready', 'data2', data);
      }
    
    • 哨兵函数
    // 哨兵函数
    const dataObj1 = {};
    function done(key, value) {
      dataObj1[key] = value;
      if (Object.keys(dataObj1).length === 2) {
        console.log('数据获取成功1', dataObj1);
      }
    }
    
    fs.readFile(__dirname + '/test.txt', 'utf-8', (err, data) => {
      if (err) {
        console.log('err', err);
        throw new Error('文件读取出错');
      } else {
        done('data1', data);
      }
    });
    fs.readFile(__dirname + '/trst1.txt', 'utf-8', (err, data) => {
      if (err) {
        console.log('err', err);
        throw new Error('文件读取出错');
      } else {
        done('data2', data);
      }
    });
    

    相关文章

      网友评论

          本文标题:异步函数

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