Promise介绍

101 阅读2分钟

Promise是一个构造函数,用于创建Promise对象
Promise主要用于解决回调地狱的问题

Promise出现原因(可以解决什么)

回调地狱:异步回调 层层嵌套
代码理解:

const fs = require('fs')
fs.readFile(`${__dirname}/data/a.txt`,'utf8',(err,data)=>{
  if(err){
    throw err
  }else{
    console.log(data);
    fs.readFile(`${__dirname}/data/b.txt`,'utf8',(err,data)=>{
      if(err){
        throw err
      }else{
        console.log(data);
        fs.readFile(`${__dirname}/data/c.txt`,'utf8',(err,data)=>{
          if(err){
            throw err
          }else{
            console.log(data);
            fs.readFile(`${__dirname}/data/d.txt`,'utf8',(err,data)=>{
              if(err){
                throw err
              }else{
                console.log(data);
              }
            })
          }
        })
      }
    })
  }
})

使用Promise

1.实例化Promise对象

 作用: 将异步操作代码 放入 Promise中

      resolve:异步操作 成功状态
      reject : 异步操作 失败状态

 new Promise((resolve,reject)=>{ 你的异步操作 })

2.调用then()方法处理异步操作结果

 promise对象.then((data)=>{ 处理成功数据 },(err)=>{ 处理失败信息 });
 

代码展示具体写法:

const fs = require('fs')
let p = new Promise((resolve,reject)=>{
  fs.readFile(`${__dirname}/data/a.txt`,'utf-8',(err,data)=>{
    if(err){
      resolve(err)
    }else{
      reject(data)
    }
  })
})
p.then(res=>{
  console.log(res);
},err=>{
  console.log(err);
})

Promise原理

Promise本质只是一个容器,它无法控制异步代码执行,Promise.then才是异步
1.promise对象有三个状态.
a. pending(进行中)
b. fulfilled(已成功)
c. rejected(已失败)

2.Promise对象的状态改变, 只有两种可能:
a. 从pending变为fulfilled
* 此时应该执行 resolve();
b. 从pending变为rejected。
* 此时应该执行 reject();

3.promise在创建对象的时候,里面的代码会立即执行.
a. promise创建时,里面的代码还是异步无序操作
b. promise的原理是,利用then方法将异步操作的结果 按照顺序执行
*** 总结: 不要在创建promise的时候去处理异步操作结果,而应该通过 then() 方法来处理 ***

Promise解决回调地狱封装

const fs = require('fs');


//1.封装一个函数 :  根据文件名生成  文件读取的promise
function getPromise(fileName) {
    let p = new Promise((resolve, reject) => {
        //读文件
        fs.readFile(`./data/${fileName}.txt`,'utf-8', (err, data) => {
            if (err == null) {
                //成功
                resolve(data);
            } else {
                //失败
                reject(err);
            }
        });
    });
    return p;
};

//2.解决需求: 要先读a, 读完a后读b, 读完b后读c.

//开始读取a
getPromise('a').then((data)=>{
    console.log(data);
    //继续读取b
    return getPromise('b');
}).then((data)=>{
    console.log(data);
    //继续读取c
    return getPromise('c');
}).then((data)=>{
    console.log(data);
});//异步回调队列结束

ES6异步函数async与await

异步函数async相当于是promise语法的 “高级写法”

async和await异步函数 : 这两个关键字只能用于函数, 所以用的时候一定要放在函数里面用

async关键字: 修饰函数。 表示这个函数内部有异步操作。 await关键字: 等待异步执行完毕。 (1)await只能用于被async修饰的函数中。
只有当await后面的异步操作执行完毕后,才会继续执行后面代码 (2)await 后面 只能是promise对象

const fs = require("fs");
/* 
promise实例对象的catch方法 : 用于捕获异步操作的错误信息
*/
//1.封装一个函数 :  根据文件名生成  文件读取的promise
function getPromise(fileName) {
    let p = new Promise((resolve, reject) => {
        //读文件
        fs.readFile(`./data/${fileName}.txt`, 'utf-8', (err, data) => {
            if (err == null) {
                //成功
                resolve(data);
            } else {
                //失败
                reject(err);
            }
        });
    });
    return p;
};

//2.解决需求: 要先读a, 读完a后读b, 读完b后读c.
const readFile = async () => {
    
    let data1 = await getPromise('a')
    console.log(data1)

    let data2 = await getPromise('b')
    console.log(data2)

    //async异步函数的错误信息要用try-catch来捕捉
    try {
        let data3 = await getPromise('c')
        console.log(data3)
    } catch (err) {
        console.log(err)

    }
}

readFile()

axios原理其实就是Promise,有时间继续补充...