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













posted @ 2020-06-12 15:36  CatherLee  阅读(373)  评论(0编辑  收藏  举报