zoukankan      html  css  js  c++  java
  • Vue 前后端交互 (Promise)

    URL 地址格式

    传统形式

    schema:// host:port / path ? query # fragment 
    

    schema : 协议 http ftp
    host : 域名或 IP 地址
    port : 端口 默认为 80
    path : 路径 abc/lzh/ (虚拟 用于区分资源)
    query : 查询参数 uname=list&age = 12
    fragment : 锚点 (哈希 Hash) 用于定位页面位置

    Restful 形式

    Http 请求方式

    GET 查询
    POST 添加
    PUT 修改
    DELETE 删除

     

    异步调用

    常见异步: 定时任务、Ajax、事件函数

    注意: 如果存在依赖,则必须嵌套,易引起回调地狱

    Promise

    • 主要解决异步深层嵌套的问题
    • promise 提供了简洁的API 使得异步操作更加容易
    • 本质是函数(对象)

    使用方法

    1、使用new来构建一个Promise
    2、 Promise的构造函数接收一个参数,是函数,并且传入两个参数: resolvereject, 分别表示异步操作执行成功后的回调函数和异步操作执行失败后的回调函数

     
      <script type="text/javascript">
        var p = new Promise(function(resolve, reject){
          //2. 这里用于实现异步任务  setTimeout
          setTimeout(function(){
            var flag = false;
            if(flag) {
              //3. 正常情况
              resolve('hello');
            }else{
              //4. 异常情况
              reject('出错了');
            }
          }, 100);
        });
    
        p.then(function(data){
          console.log(data)
        },function(info){
          console.log(info)
        });
      </script>
    

    基于Promise 发送Ajax 请求

    <script type="text/javascript">
        function queryData(url) {
         #   1.1 创建一个Promise实例
          var p = new Promise(function(resolve, reject){
            var xhr = new XMLHttpRequest();
            xhr.onreadystatechange = function(){
              if(xhr.readyState != 4) return;
              if(xhr.readyState == 4 && xhr.status == 200) {
                # 1.2 处理正常的情况
                resolve(xhr.responseText);
              }else{
                # 1.3 处理异常情况
                reject('服务器错误');
              }
            };
            xhr.open('get', url);
            xhr.send(null);
          });
          return p;
        }
    	# 注意:  这里需要开启一个服务 
        # 在then方法中,你也可以直接return数据而不是Promise对象,在后面的then中就可以接收到数据了
        queryData('http://localhost:3000/data')
          .then(function(data){
            console.log(data)
            #  1.4 想要继续链式编程下去 需要 return  
            return queryData('http://localhost:3000/data1');
          })
          .then(function(data){
            console.log(data);
            return queryData('http://localhost:3000/data2');
          })
          .then(function(data){
            console.log(data)
          });
      </script>
    

    注意:利用then 链式编程

    1、then 调用上一个 return 的promise对象,即为return queryData('http://localhost:3000/data1');
    2、then() 内函数的data 为上return 的值

    then 参数中返回值

    1、 返回 Promise 实例对象

    返回的实例对象会调用下一个 then

    如上例子

    2、返回普通值

    返回的普通值会直接传递给下一个then,通过then参数中函数的参数接收该值

    Promise 常用API

    实例方法

    .then()

    • 得到异步任务正确的结果

    .catch()

    • 获取异常信息

    .finally()

    • 成功与否都会执行(不是正式标准)

    代码实例

      
      <script type="text/javascript">
        function foo() {
          return new Promise(function(resolve, reject){
            setTimeout(function(){
              // resolve(123);
              reject('error');
            }, 100);
          })
        }
        // foo()
        //   .then(function(data){
        //     console.log(data)
        //   })
        //   .catch(function(data){
        //     console.log(data)
        //   })
        //   .finally(function(){
        //     console.log('finished')
        //   });
    
        // --------------------------
        // 两种写法是等效的
        foo()
          .then(function(data){
            # 得到异步任务正确的结果
            console.log(data)
          },function(data){
            # 获取异常信息
            console.log(data)
          })
          # 成功与否都会执行(不是正式标准) 
          .finally(function(){
            console.log('finished')
          });
      </script>
    

    对象方法

    • Promise.all() 并发处理多个异步任务,所有任务都执行完成才能得到结果

    • Promise.race() 并发处理多个异步任务,只要有一个任务完成就能得到结果

    两者都为接受数组作为参数,数组的对象(p1,p2,p3) 均为promise 实例。
    前者的状态由三个promise 实例决定
    后者的状态当其中有一个实例的状态发生改变,则p的状态跟着改变,并把第一个改变状态的 promise的返回值,传给p的回调函数

      <script type="text/javascript">
    
        function queryData(url) {
          return new Promise(function(resolve, reject){
            var xhr = new XMLHttpRequest();
            xhr.onreadystatechange = function(){
              if(xhr.readyState != 4) return;
              if(xhr.readyState == 4 && xhr.status == 200) {
                // 处理正常的情况
                resolve(xhr.responseText);
              }else{
                // 处理异常情况
                reject('服务器错误');
              }
            };
            xhr.open('get', url);
            xhr.send(null);
          });
        }
    
    
    // 以上为封装的代码
        var p1 = queryData('http://localhost:3000/a1');
        var p2 = queryData('http://localhost:3000/a2');
        var p3 = queryData('http://localhost:3000/a3');
         Promise.all([p1,p2,p3]).then(function(result){
           //   all 中的参数  [p1,p2,p3]   和 返回的结果一 一对应["HELLO TOM", "HELLO JERRY", "HELLO SPIKE"]
           console.log(result) //["HELLO TOM", "HELLO JERRY", "HELLO SPIKE"]
         })
        Promise.race([p1,p2,p3]).then(function(result){
          // 由于p1执行较快,Promise的then()将获得结果'P1'。p2,p3仍在继续执行,但执行结果将被丢弃。
          console.log(result) // "HELLO TOM"
        })
      </script>
    
  • 相关阅读:
    java使用jsp servlet来防止csrf 攻击的实现方法
    Fiddler抓包6-get请求(url详解)
    Fiddler抓包5-接口测试(Composer)
    Fiddler抓包4-工具介绍(request和response)
    Fiddler抓包3-查看get与post请求
    Selenium2+python自动化60-异常后截图(screenshot)
    Selenium2+python自动化59-数据驱动(ddt)
    Selenium2+python自动化58-读取Excel数据(xlrd)
    Selenium2+python自动化57-捕获异常(NoSuchElementException)
    Selenium2+python自动化56-unittest之断言(assert)
  • 原文地址:https://www.cnblogs.com/lzhCreate/p/14374900.html
Copyright © 2011-2022 走看看