回调地狱之promise

93 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第17天,点击查看活动详情

“金秋十月,我要连续30天更文,做劳模,拿手机摄影神器!点击查看活动详情 “即可成功参与

回调地狱

回调地狱介绍:多层回调函数的相互嵌套,就形成了回调地狱

回调地狱解决方案:为了解决回调地狱 的问题,出现了promise概念

promise基础语法

概念:

  • promise是一个构造函数,使用的时候需要new一下
  • 必须传入一个函数作为promise的参数,这个函数在new promise的时候就会执行
  • 函数相当于一个容器,可以将异步任务放到这里,然后通过.then()方法,处理结果
  • 函数有resolve和reject两个形参
  • 将异步成功的结果传给resolve函数,将失败的信息传给reject函数
//创建了一个promise的实例p 
let p = new promise((resolve, reject) => {
   //放异步操作的代码
    if(异步操作成功){
        resolve(value) //异步操作成功,向外抛出成功的数据
    }else{
        reject(error)  //异步操作失败,向外抛出失败的值
    }
})
//在异步函数外对抛出的数据进行处理:当promise异步程序成功,就会调用成功的回调函数,失败就会调用失败的回调函数
p.then(成功的回调函数,失败的回调函数)
注意:then的调用者必须是promise对象,可以链式调用

then()的返回值默认返回一个promise空对象

catch方法:捕获错误

如果链式操作中,发生了错误,可以使用catch()方法进行捕获错误并进行处理

放在链接结构的最后,会捕获前面所有的错误,只要出错,就捕获到,并且后面的then就不会执行

想要这个错误不影响后面的then,将这个方法提前到可能会错误的后面

then—fs解决回调地狱

then—fs这个第三方模块,直接返回promise对象,获取的数据在promise对象里

fs模块读取数据,需要些回调函数,在回调函数里进行操
let a=fs.readFile('文件路径','编码格式','成功回调函数') //这里需要写成功回调函数,是因为要在回调函数里处理结果thenFs模块读取数据,不需要回调函数,他直接返回promise对象,可以在外面进行数据操作
let p=thenFs.readFile('文件路径','编码格式') //当对文件进行操作时,它直接将结果直接返回到promise对象里,也就是p里,所以可以直接在外面对数据进行操作
p.then()//对获取的数据进行操作

promist对象,其实就是将异步程序的结果拿到异步程序外面处理,这样解决了函数嵌套的问题

简化promise操作

async和await关键词(获取成功的结果)

这两个关键词的出现,更加简化了promise的使用

1、asyn用于修饰一个function

  • async修饰的函数,返回值返回的是一个promise对象(也就是不需要我们去new了
  • 函数内的返回值,将自动包装在resolved的promise中(也就是不需要用resolved往外抛数据了)
let p = async function(){//直接将这个函数的返回值变成promise对象
    reture 123  //这个值直接在promise对象里
}
console.log(p()) //返回一个promise对象  promise {123}

async关键词帮我们省去了:

1、new promise对象,

2、和resolved抛出数据

2、await 只能出现在async函数内

  • await 让JS引擎等待直到promise完成并返回结果
  • await只能出现在异步函数中
  • await能停止await后面执行代码,让异步函数外的同步代码先执行
  • await后面跟随的是一个promise对象
  • await返回的是:promise对象中的then()中回调函数中的参数res(也就是直接拿出resolved里的数据)
async function getPromise(){
     return 123
}
async function fn(){
    let a= await  getPromise()//直接将resolved里的数据拿出来
    return a
}
​
sonsole.log(fn()) //a

await关键词帮我们省去了:

1、通过点.then()方法获取数据

注意:目前拿到的数据都是异步成功的数据,也就是resolved抛出的数据

综合解决回调地狱的问题

const thenFs from 'then-fs'
async function fn(){
    let res1 = await thenFs.readFile('./text/01.txt','utf-8') //将promise对象里的数据直接抠出来  
    console.log(res1)
    let res2 = await thenFs.readFile('./text/02.txt','utf-8') //将promise对象里的数据直接抠出来  
    console.log(res2)
    let res3 = await thenFs.readFile('./text/03.txt','utf-8') //将promise对象里的数据直接抠出来  
    console.log(res4)
}
​

如果异步程序出错

try cathc(捕获错误)

const thenFs from 'then-fs'
async function fn(){
    tyr{ //尝试执行一些代码
         let res1 = await thenFs.readFile('./text/01.txt','utf-8') //将promise对象里的数据直接抠出来  
          console.log(res1)
         let res2 = await thenFs.readFile('./text/02.txt','utf-8') //将promise对象里的数据直接抠出来  
          console.log(res2)
         let res3 = await thenFs.readFile('./text/03.txt','utf-8') //将promise对象里的数据直接抠出来  
          console.log(res4)
    }catch (err){//捕获错误
        console.log(err.message)
    }finally{//不管正确还是错误都会执行的代码
        console.log('一定会执行的代码') 
    }
}
​