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并不能改变返回值