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

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
})
相关推荐
liyi_hz20081 分钟前
O2OA(翱途) V10.1 即将发布|功能再升级,安全再加固,协同更高效!
java·javascript·windows·开源软件
输出输入14 分钟前
学习前端主流书单推荐
前端
anyup15 分钟前
uView Pro X 1.0.0 发布:全面支持 uni-app x 蒸汽模式,80+ 组件
前端·uni-app·ai编程
apollo_qwe29 分钟前
大模型 API 接通了,AI 聊天页面为什么还是不好用?
前端·vue.js·人工智能
爱勇宝31 分钟前
你可能成不了技术大佬,然后呢?
前端·后端·程序员
疯华整猫1 小时前
从 MVP 到 MVI,从 Java 到 Kotlin:老项目升级的避坑指南
前端
徐小夕@趣谈前端1 小时前
Web 端 OFD 编辑器踩坑记:从“只能预览”到“在线改”
前端·编辑器
志尊宝1 小时前
AI原生前端开发(029):AI辅助的文档自动生成
javascript·人工智能·ai-native
一个游离的指针2 小时前
ES6新特性:let、const、块级作用域
开发语言·javascript·es6
前端小万2 小时前
想做个人副业别乱买服务器!我的 5 个月真实开销分享
前端·后端·github