【ES6】Promise

本文介绍了Promise在JavaScript中的作用,如何避免回调地狱,展示了基本用法、Promise三种状态、同步与异步的区别以及链式调用示例。通过实例演示了如何使用Promise封装`fs.readFile`操作实现文件读取的异步流程控制。
摘要由CSDN通过智能技术生成

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);
    })
  })
})

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));

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
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
})
  • 9
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值