• 【ES6】Promise


    Promise

    回调地狱

    const fs = require('fs');
    
    fs.readFile('./a.txt', 'utf-8', (err, data) => {
      if(err) throw err;
      console.log(data);
    
      fs.readFile('./b.txt', 'utf-8', (err, data) => {
        if(err) throw err;
        console.log(data);
    
        fs.readFile('./c.txt', 'utf-8', (err, data) => {
          if(err) throw err;
          console.log(data);
        })
      })
    })
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    Promise

    Promise对象可以解决回调地狱的问题

    Promise可以理解为一个容器,里面可以编写异步程序的代码

    基本用法
    const fs = require('fs');
    
    //1、创建对象
    let p = new Promise((resolve, reject) => {
      //把异步任务成功的结果传递给resolve函数,把失败的结果传递给reject函数
      fs.readFile('./a.txt', 'utf-8', (err, data) => {
       //读取文件的时候,没有错误err=null, 有错误err={} 
        err ? reject(err) : resolve(data);
      })
    });
    
    //2、获取成功失败结果
    p.then(res => console.log(res), err => console.log(err));
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    Promise三种状态

    pending fulfilled rejected

    • 最初状态pending, 等待中,此时promise的结果为undefined;

    • 当调用resolve(data)时, 状态变为 fulfilled

    • 当调用reject(err)时, 状态变为 error

    • 当达到最终的fulfilled或rejected时,promise的状态就不会再改变了(所以多次调用resolve,后面的resolve都无效,只取第一次)

      // 1、创建对象
      let p = new Promise((resolve, reject) => {
      resolve();
      resolve(123);//这次调用无效
      });

      // 2、获取成功失败结果
      p.then(res => console.log(res), err => console.log(err));

    Promise同步异步?
    console.log(1);
    
    //new Promise属于同步代码
    new Promise((resolve, reject) => {
      console.log(2);
      resolve(3);
      console.log(4);
    }).then(res => console.log(res), err => console.log(err));//.then这里是异步的
    
    console.log(5);
    
    // 1 2 4 5 3
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    then的链式调用
    const fs = require('fs');
    
    let p1 = new Promise((resolve, reject) => {
      fs.readFile('./a.txt', 'utf-8', (err, data) => {
        err ? reject(err) : resolve(data);
      })
    });
    
    let p2 = new Promise((resolve, reject) => {
      fs.readFile('./b.txt', 'utf-8', (err, data) => {
        err ? reject(err) : resolve(data);
      })
    });
    
    let p3 = new Promise((resolve, reject) => {
      fs.readFile('./c.txt', 'utf-8', (err, data) => {
        err ? reject(err) : resolve(data);
      })
    });
    
    //前一个then返回一个Promise对象
    //后一个then可以得到前一个Promise对象的成功状态的值
    p1.then(r1 => {
      console.log(r1); //aaa
      return p2
    }).then(r2 => {
      console.log(r2); //bbb
      return p3;
    }).then(r3 => {
      console.log(r3); //ccc
    })
    
    
    
    const fs = require('fs');
    
    function myReadFile(filename) {
      return p = new Promise((resolve, reject) => {
        fs.readFile(filename, 'utf-8', (err, data) => {
          err ? reject(err) : resolve(data);
        })
      })
    }
    
    //前一个then返回一个Promise对象
    //后一个then可以得到前一个Promise对象的成功状态的值
    myReadFile('./a.txt').then(r1 => {
      console.log(r1); //aaa
      return myReadFile('./b.txt');
    }).then(r2 => {
      console.log(r2); //bbb
      return myReadFile('./c.txt');
    }).then(r3 => {
      console.log(r3); //ccc
    })
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
  • 相关阅读:
    金仓数据库 KingbaseES PL/SQL 过程语言参考手册(20. E PL/SQL 预定义类型)
    vue 常用指令
    rust字符串
    冯·诺依曼体系结构
    王道p18 第12题假设 A中的 n个元素保存在一个一维数组中,请设计一个尽可能高效的算法,找出A的主元素。若存在主元素,则输出该元素:否则输出-1
    linux 列出网络上所有活动的主机
    【docker】Dockerfile
    【网络协议】Http-中
    第十三届蓝桥杯B组c++国赛
    概率论与数理统计学习:数字特征(二)——知识总结与C语言实现案例
  • 原文地址:https://blog.csdn.net/weixin_42461272/article/details/136110367