• 石川es6课程---12、Promise


    石川es6课程---12、Promise

    一、总结

    一句话总结:

    用同步的方式来书写异步代码,让异步书写变的特别简单

    用同步的方式来书写异步代码
    Promise 让异步操作写起来,像在写同步操作的流程,不必一层层地嵌套回调函数
    改善了可读性,对于多层嵌套的回调函数很方便
    充当异步操作与回调函数之间的中介,使得异步操作具备同步操作的接口

    1、传统的异步写法?

    嵌套操作
    ajax('./banners',function(banner_data){
        ajax('./hotItems',function(hotItem_data){
                ajax('./slides',function(slide_data){
            },function(){alert("读取失败")})
        },function(){alert("读取失败")})
    },function(){alert("读取失败")})

    2、传统的同步操作数据?

    同时只能做一件事
    let banner_data=ajax_sync('./banners')
    let hotItem_data=ajax_sync('./hotItems')
    let slide_data=ajax_sync('./slides')传统的同步操作数据

    3、jquery中ajax方法的回调函数的作用是什么?

    $.ajax是不同操作的回调函数,$.post是发送成功的回调函数
    如果要处理$.ajax()得到的数据,则需要使用回调函数。beforeSend、error、dataFilter、success、complete。
    
    beforeSend 在发送请求之前调用,并且传入一个XMLHttpRequest作为参数。
    error 在请求出错时调用。传入XMLHttpRequest对象,描述错误类型的字符串以及一个异常对象(如果有的话)
    dataFilter 在请求成功之后调用。传入返回的数据以及"dataType"参数的值。并且必须返回新的数据(可能是处理过的)传递给success回调函数。
    success 当请求之后调用。传入返回后的数据,以及包含成功代码的字符串。
    complete 当请求完成之后调用这个函数,无论成功或失败。传入XMLHttpRequest对象,以及一个包含成功或错误代码的字符串。
    
    
    $.ajax({
    
      url: "test.html",
    
      cache: false,
    
      success: function(html){
    
        $("#results").append(html);
    
      }
    
    });

    4、Promise实例?

    用Promise.all(),全部成功一个回调函数,失败一个回调函数
    Promise.all()函数
    
      let p1=new Promise(function(resolve,reject){
          //异步代码
          //resolve成功
          //reject失败
          $.ajax({
              url:'https://easy-mock.com/mock/5cadb508b56fc13f6206ad0e/example/arr.txt',
              type:'get',
              dataType:'json',
              success(arr){
                  resolve(arr)
              },
              error(err){
                  reject(err)
              }
          })
      })
    
      let p2=new Promise(function(resolve,reject){
          $.ajax({
              url:'https://easy-mock.com/mock/5cadb508b56fc13f6206ad0e/example/json.txt',
              dataType:'json',
              type:'get',
              success:function(data){
                  resolve(data)
              },
              error:function(err){
                  reject(err)
              }
          })
      })
      Promise.all([p1,p2]).then(function(arr){
          let [res1,res2]=arr
          console.log(res1,res2)
      },function(){
          alert("至少一个失败")
      })

    二、Promise

    • 异步和同步

      • 异步,操作之间没有关系,同时执行多个操作, 代码复杂
      • 同步,同时只能做一件事,代码简单
    • Promise 对象

      • 用同步的方式来书写异步代码
      • Promise 让异步操作写起来,像在写同步操作的流程,不必一层层地嵌套回调函数
      • 改善了可读性,对于多层嵌套的回调函数很方便
      • 充当异步操作与回调函数之间的中介,使得异步操作具备同步操作的接口
    • Promise 也是一个构造函数

      • 接受一个回调函数f1作为参数,f1里面是异步操作的代码
      • 返回的p1就是一个 Promise 实例
      • 所有异步任务都返回一个 Promise 实例
      • Promise 实例有一个then方法,用来指定下一步的回调函数
    function f1(resolve, reject) {
      // 异步代码...
    }
    var p1 = new Promise(f1);
    p1.then(f2); // f1的异步操作执行完成,就会执行f2。
    
    • Promise 使得异步流程可以写成同步流程
    // 传统写法
    step1(function (value1) {
      step2(value1, function(value2) {
        step3(value2, function(value3) {
          step4(value3, function(value4) {
            // ...
          });
        });
      });
    });
    
    // Promise 的写法
    (new Promise(step1))
      .then(step2)
      .then(step3)
      .then(step4);
    
    • Promise.all(promiseArray)方法
      • 将多个Promise对象实例包装,生成并返回一个新的Promise实例
      • promise数组中所有的promise实例都变为resolve的时候,该方法才会返回
      • 并将所有结果传递results数组中
      • promise数组中任何一个promise为reject的话,则整个Promise.all调用会立即终止,并返回一个reject的新的promise对象
    var p1 = Promise.resolve(1),
        p2 = Promise.resolve(2),
        p3 = Promise.resolve(3);
    Promise.all([p1, p2, p3]).then(function (results) {
        console.log(results);  // [1, 2, 3]
    });
    
    • Promise.race([p1, p2, p3])
      • Promse.race就是赛跑的意思
      • 哪个结果获得的快,就返回那个结果
      • 不管结果本身是成功状态还是失败状态

    3、Promise

    1. 异步请求/操作
    • 异步:操作之间没有任何关系,可以同时进行多个操作
    • 同步:同时只能做一件事
    1. 优缺点
    • 异步缺点:代码更复杂
    • 同步优点:代码简单
    //异步操作读取数据
    ajax('./banners',function(banner_data){
        ajax('./hotItems',function(hotItem_data){
                ajax('./slides',function(slide_data){
            },function(){alert("读取失败")})
        },function(){alert("读取失败")})
    },function(){alert("读取失败")})
    //同步操作数据
    let banner_data=ajax_sync('./banners')
    let hotItem_data=ajax_sync('./hotItems')
    let slide_data=ajax_sync('./slides')
    
    1. Promise——清除异步操作
    • 本质:用同步一样的方式写异步
    • 用法: 基本的封装ajax
            let p1=new Promise(function(resolve,reject){
                //异步代码
                //resolve成功
                //reject失败
                $.ajax({
                    url:'https://easy-mock.com/mock/5cadb508b56fc13f6206ad0e/example/arr.txt',
                    type:'get',
                    dataType:'json',
                    success(arr){
                        resolve(arr)
                    },
                    error(err){
                        reject(err)
                    }
                })
            })
            p1.then(function(){},function(){})
    

    Promise.all()函数

            let p1=new Promise(function(resolve,reject){
                //异步代码
                //resolve成功
                //reject失败
                $.ajax({
                    url:'https://easy-mock.com/mock/5cadb508b56fc13f6206ad0e/example/arr.txt',
                    type:'get',
                    dataType:'json',
                    success(arr){
                        resolve(arr)
                    },
                    error(err){
                        reject(err)
                    }
                })
            })
    
            let p2=new Promise(function(resolve,reject){
                $.ajax({
                    url:'https://easy-mock.com/mock/5cadb508b56fc13f6206ad0e/example/json.txt',
                    dataType:'json',
                    type:'get',
                    success:function(data){
                        resolve(data)
                    },
                    error:function(err){
                        reject(err)
                    }
                })
            })
            Promise.all([p1,p2]).then(function(arr){
                let [res1,res2]=arr
                console.log(res1,res2)
            },function(){
                alert("至少一个失败")
            })
    

    通用封装

            function createPromise(url){
                return new Promise(function(resolve,reject){
                //异步代码
                //resolve成功
                //reject失败
                $.ajax({
                    url:url,
                    type:'get',
                    dataType:'json',
                    success(arr){
                        resolve(arr)
                    },
                    error(err){
                        reject(err)
                    }
                })
            })
            }
            Promise.all([createPromise("https://easy-mock.com/mock/5cadb508b56fc13f6206ad0e/example/arr.txt"),createPromise("https://easy-mock.com/mock/5cadb508b56fc13f6206ad0e/example/json.txt")]).then(function(arr){
                let [res1,res2]=arr
                console.log(res1,res2)
            },function(){
                alert("至少一个失败")
            })
    
    1. 有了promise之后的异步
    Promise.all([$.ajax({]}),$.ajax({})]).then(
        results=>{
            //全部成功之后的操作
        },err=>{
            //失败
        }
    )
    
    1. Promise其他用法
    • Promise.race() 竞速,与all区别是:只要有一个文件请求成功了就用谁,就会返回resolve
     
  • 相关阅读:
    nginx 跨域问题解决
    njs typescript 开发说明
    openrestyluatypes openresty typescript 类型定义
    使用 TypeScriptToLua 开发lua 应用
    如何编写一个简单的TypeScriptToLua lua 模块定义包
    docker sbom方便的软件物料清单扩展
    openresty + njs 提升系统nginx 的扩展性
    contentlayer 工作原理简单说明
    使用openrestyluatypes+TypeScriptToLua+testnginx 开发强类型的nginx lua 模块
    TypeScriptToLua npm 集成玩法
  • 原文地址:https://www.cnblogs.com/Renyi-Fan/p/11609018.html
Copyright © 2020-2023  润新知