zoukankan      html  css  js  c++  java
  • 前端 ---- Vue前端交互

    Vue前端交互
    Promise
    
    	1.promise的实例方法
            1).then() 得到异步任务正确的结果
            2).catch() 获取异常信息
            3).finally()成功与否都会执行(不是正式标准)
            
    		1.promise return 一个普通值会默认创建一个新的promise对象然后调用
    		2.promise 中的finally,不论成功与否,都会调用,但是.finally(function(data){console.log(data)})中的data是undefined,是没有数据的
    		列子1:
    		  <script type="text/javascript">
    			/*
    			  基于Promise发送Ajax请求
    			*/
    			function queryData(url) {
    			  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) {
    					// 处理正常的情况
    					resolve(xhr.responseText);
    				  }else{
    					// 处理异常情况
    					reject('服务器错误');
    				  }
    				};
    				xhr.open('get', url);
    				xhr.send(null);
    			  });
    			  return p;
    			}
    			// queryData('http://localhost:3000/data')
    			//   .then(function(data){
    			//     console.log(data);
    			//   },function(info){
    			//     console.log(info)
    			//   });
    			// ============================
    			// 发送多个ajax请求并且保证顺序
    			queryData('http://localhost:3000/data1')
    			  .then(function(data){
    				console.log(data)
    				return queryData('http://localhost:3000/data2')
    			  })
    			  .then(function(data){
    				console.log(data);
    				console.log('-----------------------------------------------------')
    				return 'xiaoming'
    			  })
    			  .then(function(data){
    				console.log(data);
    			  })
    			  .finally(function (data) {
    				// body...
    				console.log('haha')
    			  })
    
    		  </script>	
    	2.promise的对象方法
        1).all()
        `Promise.all`方法接受一个数组作参数,数组中的对象(p1、p2、p3)均为promise实例(如果不是一个promise,该项会被用`Promise.resolve`转换为一个promise)。它的状态由这三个promise实例决定
        (会把p1,p2,p3都执行了)
    	2).race()`Promise.race`方法同样接受一个数组作参数。当p1, p2, p3中有一个实例的状态发生改变(变为`fulfilled`或`rejected`),p的状态就跟着改变。并把第一个改变状态的promise的返回值,传给p的回调函数
        (p1,p2,p3中的一个执行了,另外两个会继续发送,但不会执行函数内容)
        
        all和race好像不能同时使用?
        
        
    fetch
        1.概述
            Fetch API是新的ajax解决方案 Fetch会返回Promise
            fetch不是ajax的进一步封装,而是原生js,没有使用XMLHttpRequest对象
            fetch(url, options).then()
            例子1:
              <script type="text/javascript">
                /*
                  Fetch API 基本用法
                    fetch(url).then()
                    第一个参数请求的路径   Fetch会返回Promise   所以我们可以使用then 拿到请求成功的结果 
                */
                fetch('http://localhost:3000/fdata').then(function(data){
                  // text()方法属于fetchAPI的一部分,它返回一个Promise实例对象,用于获取后台返回的数据
                  return data.text();
                }).then(function(data){
                  //   在这个then里面我们能拿到最终的数据  
                  console.log(data);
                })
              </script>
        2.fetch API  中的 HTTP  请求
        
            fetch(url, options).then()
            HTTP协议,它给我们提供了很多的方法,如POST,GET,DELETE,UPDATE,PATCH和PUT
                1.默认的是 GET 请求
                2.需要在 options 对象中指定对应的 method       method:请求使用的方法 
                3.post 和 普通 请求的时候 需要在options 中设置请求头 headers和body
    
            这边也分'Content-Type': 'application/x-www-from-urlencoded'和'application/json'
            所以服务器也分app.use(bodyParser.json())和app.use(bodyParser.urlencoded({ extended: false }));
        
            例子2:
                <script type='text/javascript'>
    
                    fetch('http://localhost:3000/fdata').then(function (argument) {
                    // body...
                    return argument.text()
                    }).then(function (argument) {
                        // body...
                        console.log(argument)
                    })
                    fetch('http://localhost:3000/books?id=123',{method:'get'}).then(function (argument) {
                        // body...
                        return argument.text()
                    }).then(function (argument) {
                        // body...
                        console.log(argument)
                    })
                    fetch('http://localhost:3000/books1/123',{method:'get'}).then(function (argument) {
                        // body...
                        return argument.text()
                    }).then(function (argument) {
                        // body...
                        console.log(argument)
                    })
                    fetch('http://localhost:3000/books2/123',{method:'delete'}).then(function (argument) {
                        // body...
                        return argument.text()
                    }).then(function (argument) {
                        // body...
                        console.log(argument)
                    })
                        POST请求传参
                    fetch('http://localhost:3000/books3', {
                      method: 'post',
                      body: JSON.stringify({
                        uname: '张三',
                        pwd: '456'
                      }),
                      headers: {
                        'Content-Type': 'application/json'
                      }
                    })
                      .then(function(data){
                        return data.text();
                      }).then(function(data){
                        console.log(data)
                      });
    
                    fetch('http://localhost:3000/books1/123', {
                      method: 'put',
                      body: JSON.stringify({
                        uname: '张三',
                        pwd: '789'
                      }),
                      headers: {
                        'Content-Type': 'application/json'
                      }
                    })
                      .then(function(data){
                        return data.text();
                      }).then(function(data){
                        console.log(data)
                      });
                </script>
                
        3.fetchAPI 中 响应格式  响应结果分为text和JSON
            用fetch来获取数据,如果响应正常返回,我们首先看到的是一个response对象,其中包括返回的一堆原始字节,这些字节需要在收到后,需要我们通过调用方法将其转换为相应格式的数据,比如`JSON`,`BLOB`或者`TEXT`等等
            例子3:
                fetch('http://localhost:3000/json').then(function(data){
                  // return data.json();   //  将获取到的数据使用 json 转换对象
                  return data.text(); //  //  将获取到的数据 转换成字符串 
                }).then(function(data){
                  // console.log(data.uname)
                  // console.log(typeof data)
                  var obj = JSON.parse(data);
                  console.log(obj.uname,obj.age,obj.gender)
                })
                
        PS:text()方法属于fetchAPI的一部分,它返回一个Promise实例对象,用于获取后台返回的数据
    
            
    
    axios
    	1.传参
            如果使用params传参,服务端是通过 xx.query.xx来获得参数的,如ret.query.id,如果用params就是undefined
            
            在POST中,现在用URLSearchParams来提交也是返回对象格式,而不是字符串
            PUT要传ID进去,不然怎么知道你更新的是哪个对象
    	2.全局配置
            在传递请求头时,要到服务端允许该请求头的跨域使用
            
            #  配置公共的请求头 
            axios.defaults.baseURL = 'https://api.example.com';
            #  配置 超时时间
            axios.defaults.timeout = 2500;
            #  配置公共的请求头
            axios.defaults.headers.common['Authorization'] = AUTH_TOKEN;
            # 配置公共的 post 的 Content-Type
            axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
    	3.拦截器
            1.请求拦截器 req  请求拦截器的作用是在请求发送前进行一些操作
            2.响应拦截器 res  响应拦截器的作用是在接收到响应后进行一些操作
            例子:
                # 1. 请求拦截器 
                axios.interceptors.request.use(function(config) {
                  console.log(config.url)
                  # 1.1  任何请求都会经过这一步   在发送请求之前做些什么   
                  config.headers.mytoken = 'nihao';
                  # 1.2  这里一定要return   否则配置不成功  
                  return config;
                }, function(err){
                   #1.3 对请求错误做点什么    
                  console.log(err)
                })
                #2. 响应拦截器 
                axios.interceptors.response.use(function(res) {
                  #2.1  在接收响应做些什么  
                  var data = res.data;
                  return data;
                }, function(err){
                  #2.2 对响应错误做点什么  
                  console.log(err)
                })
    	4.async await后面要接promise实例对象
            1.async作为一个关键字放到函数前面
            2.任何一个async函数都会隐式返回一个`promise`
            3.await关键字只能在使用async定义的函数中使用
            4.await后面可以直接跟一个 Promise实例对象
            5.await函数不能单独使用
  • 相关阅读:
    Android WifiDisplay分析一:相关Service的启动
    Android4.2以后,多屏幕的支持 学习(一)
    第十七篇 --ANDROID DisplayManager 服务解析一
    Android Wi-Fi Display(Miracast)介绍
    Ubuntu下 Astah professional 6.9 安装
    JAVA调用c/c++代码
    Application Fundamentals
    说说Android应用的persistent属性
    Tasks and Back stack 详解
    Activity的四种launchMode
  • 原文地址:https://www.cnblogs.com/otome/p/13704194.html
Copyright © 2011-2022 走看看