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. 捕获错误
根据需求,终止链式调用的执行:手动抛出一个错误

浙公网安备 33010602011771号