es6异步回调-promise
引入例子:先判断有没有这个文件,有的话删除文件
const fs=require('fs') fs.stat('./hehe.js',(err,stats)=>{ if(err){ console.log('文件不存在') }else{ fs.unlink('./hehe.js',(err)=>{ console.log(err) fs.writeFile('./test.js','xxxx',()=>{ ... }) }) } })
出现的问题:异步操作需要保持一定的执行顺序 ,所以造成回调函数的嵌套 => 回调地狱( 弊端:代码不好看,错误不好调试)
如何解决异步回调地狱:promise , asyc/awiat(es7), 蓝鸟
参考资料:js promise 迷你书
由来:promise 最早是在E语言中提出的,它是基于并列/并行处理设计的一种编程语言。之后 JS promise 也可拥有了这种特性。
promise如何使用
1.new一个Promise对象,对象传递个回调函数,函数有两个参数,resolve(成功) 和 reject(失败)。
function delfile(){ return new Promise((resolve,reject)=>{ //异步操作 reject('失败了')// 外部通过chatch 接受 表示失败的处理 }) }
delfile() .then((msg)=>{ console.log('then:'+msg) }) .catch((err)=>{ console.log('err:'+err) })
总结:
封装一个promise对象,并return 出去;
执行resolve,外部走then的处理函数 表示内部执行成功,执行 reject,外部通过catch接收,表示内部失败。
promise链式调用
实现:先判断有没有这个文件,有的话删除文件
const fs=require('fs'); //判断文件是否存在 function isEixt(){ return new Promise((resolve,reject)=>{ fs.stat('./hehe.js',(err,stats)=>{ if(err){ reject('文件不存在') }else{ resolve('文件存在') } }) }) } //删除文件 function delFile(){ return new Promise((resolve,reject)=>{ fs.unlink('./hehe.js',(err)=>{ if(err){ reject('del no ok') }else{ resolve('del ok') } }) }) } //执行 isEixt() .then(()=>{ console.log('is exit 的成功处理') return delFile() }) .then(()=>{ console.log('删除文件成功处理') }) .catch((err)=>{ console.log('catch') console.log(err) }) // 链式调用 :.then().then()....catch() 一直执行下去
// 总结: ⚠️ 一组链式调用中只需要一个catch,不管哪个promise中出现reject错误,都会在catch中捕到。 // 如何手动终止链式调用的执行:手动抛出一个错误
如何终止链式调用的执行
做法:抛出一个错误:throw new Error('手动终止')
总结:
大量的异步操作 如果需要顺序执行 通过回调函数执行 回调地狱
通过promise 解决回调地狱
1. 封装promise 函数
function test(){
// 返回promise
return new Promise((resolve,reject)=>{
// 需要的异步处理
// 成功的时候 resolve
// 失败 reject
})
}
2. 根据顺序 形成链式调用
test().then().then()....catch() 一直执行下去,
⚠️ 一组链式调用中只需要一个catch,不管哪个promise中出现reject错误,都会在catch中捕到。
3. 捕获错误
根据需求,终止链式调用的执行:手动抛出一个错误