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













  • 相关阅读:
    James 3.1服务器的安装与搭建
    Mybaits整合Spring
    动态sql
    Mybatis核心配置文件SqlMapConfig.xml
    Mapper动态代理方式
    WPF DatePicker
    UITableView(修改单元格)
    UITableView
    UIImageView
    UILabel
  • 原文地址:https://www.cnblogs.com/catherLee/p/13099387.html
Copyright © 2011-2022 走看看