promise.than().finally() 和async-await try-catch-finally

690 阅读1分钟

Promise中始终执行配合finally使用

  • Promise是一个容器,保存异步代码的执行结果;
  • 作用:解决异步回调地域(异步代码,层层嵌套);
  • 缺陷:语法、编码上还是存在嵌套现象
  • promise方法all race any
const fs = require('fs')
function createPromise(name){
    return new Promise((resolve, reject) => {
        fs.readFile(`${__dirname}/${name}.txt`,'UTF-8', (error, data)=>{
            if(data){
                resolve(data)
            }else{
                reject(error)
            }
        })
    })
}
createPromise("a").then(data=>{
    console.log(data)
    return createPromise("b")
}).then(data=>{
    console.log(data)
    return createPromise("c")
}).then(data=>{
    console.log(data)
    return createPromise("d")
}).then(data=>{
    console.log(data)
}).catch(error=>{
    console.log(error)
}).finally(()=>{
    console.log('无论成功失败回调都执行')
})

async-await中始终执行需要借用try-catch-finally来执行

异常机制中还有一个重要的部分,就是finally, catch后面可以跟finally语句,语法如下所示:

try{
    //可能抛出异常
}catch(Exception e){
    //捕获异常
}finally{
    //不管有无异常都执行
}

finally内的代码不管有无异常发生,都会执行。具体来说:

  • 如果没有异常发生,在try内的代码执行结束后执行。
  • 如果有异常发生且被catch捕获,在catch内的代码执行结束后执行
  • 如果有异常发生但没被捕获,则在异常被抛给上层之前执行。

由于finally的这个特点,它一般用于释放资源,如数据库连接、文件流等。 try/catch/finally语法中,catch不是必需的,也就是可以只有try/finally,表示不捕获异常,异常自动向上传递,但finally中的代码在异常发生后也执行。

finally语句有一个执行细节,如果在try或者catch语句内有return语句,则return语句在finally语句执行结束后才执行,但finally并不能改变返回值