zoukankan      html  css  js  c++  java
  • vue-resource调用promise取数据方式整理

    转自:http://my.csdn.net/sinat_17775997

    先来说说 vue-resource

    vue-resource是Vue.js的一款插件,它可以通过XMLHttpRequest或JSONP发起请求并处理响应。也就是说,$.ajax能做的事情,vue-resource插件一样也能做到,而且vue-resource的API更为简洁。

    vue-resource的优势和介绍,可以通过下面这个地址来了解。
    Vue.js——vue-resource全攻略

    vue-resource的API分别有以下这些:
    http get
    http jsonp
    http post
    http put
    http delete
    resource get
    resource save
    resource update
    resource remove
    inteceptor

    我现在的工作中,常用的就是get和post。
    引入vue-resource后,可以基于全局的Vue对象使用http,也可以基于某个Vue实例使用http。现在的项目中,基本上都是后者,因此在不同组件的beforeCreate或mounted钩子中取。

    // 基于全局Vue对象使用http
    Vue.http.get('/someUrl', [options]).then(successCallback, errorCallback);
    Vue.http.post('/someUrl', [body], [options]).then(successCallback, errorCallback);
    
    // 在一个Vue实例内使用$http
    this.$http.get('/someUrl', [options]).then(successCallback, errorCallback);
    this.$http.post('/someUrl', [body], [options]).then(successCallback, errorCallback);

    在发送请求后,使用then方法来处理响应结果,then方法有两个参数,第一个参数是响应成功时的回调函数,第二个参数是响应失败时的回调函数。

    vue-resource支持Promise API,Promise是ES6的特性,Promise的中文含义为“先知”,Promise对象用于异步计算。

    再简单介绍一下Promise对象

    ES6原生提供了Promise对象。所谓Promise对象,就是代表了未来某个将要发生的事件(通常是一个异步操作)。它的好处在于,有了Promise对象,就可以将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数。此外,Promise对象还提供了一整套完整的接口,使得可以更加容易地控制异步操作。Promise对象的概念的详细解释,请参考《JavaScript标准参考教程》

    ES6的Promise对象是一个构造函数,用来生成Promise实例。下面是Promise对象的基本用法。

    var promise = new Promise(function(resolve, reject) {
      if (/* 异步操作成功 */){
        resolve(value);
      } else {
        reject(error);
      }
    });
    
    promise.then(function(value) {
      // success
    }, function(value) {
      // failure
    });

    下面我们来直接使用:

    假如我们请求下面这个json文件:

    // 请求成功
    {
        "code": 0,
        "msg": "get member success",
        "content": {
            "plank_id": "1",
            "start_at": "1234567890",
            "status": "3",
            "members_num": 1,
            "members": [
                {
                    "id": "14",
                    "name": "",
                    "avatar": "",
                    "status": "3"
                }
            ]
        },
        "is_mobile_user": false,
        "jssdk": {
            "appId": "wxec4d172a4f73ee6f",
            "timestamp": "1490367697",
            "nonceStr": "58d534d1b536a",
            "signature": "d8d8ceb0f39ddeb3085fd197e5df5caddb1f1ba1"
        }
    }
    
    // 请求失败
    {
      "code": 1,
      "msg": "错误信息",
      "content": "",
      "is_mobile_user": true,
      "jssdk": {
        "appId": "wxec4d172a4f73ee6f",
        "timestamp": "1487750749",
        "nonceStr": "58ad465dd5ba5",
        "signature": "4aa01f5a89ce79ee4c53249e0cdb84800f841004"
      }
    }

    get 传统的写法

    import {MessageBox} from 'mint-ui';
    this.$http.get(dataUrl)
        .then(function (response) {   // 请求成功 
            let data = response.data;
            if (data.code === 0) {
                this.content = data.content;     // 取到数据
            } else {
                MessageBox('提示', data.msg);
            }
        }, function (response) {  // 请求失败 
            MessageBox('提示', response.data.msg);
        })

    get ES6的语法 直接用解构赋值和剪头函数的方式

    import {MessageBox} from 'mint-ui';
    this.$http.get(dataUrl)
        .then(({data:{code, content, jssdk, msg}}) => {   // 请求成功 
            if (data.code === 0) {
                this.content = content;     // 取到数据
            } else {
                MessageBox('提示', msg);
            }
        },  ({data:{msg}}) => {  // 请求失败 
            MessageBox('提示',msg);
        });

    post 传统的语法

    let group_id = this.$route.params.id;
    let data = {
          group_id: group_id,
          mobile: this.mobile,
          code: this.smsCode,
          name: this.memberName
    };
    import {MessageBox} from 'mint-ui';
    this.$http.post(checkUrl, data)
        .then(function (response) { // 请求成功
            let data = response.data;
            if (data.code === 0) {
               this.content = data.content;   // 取到数据
            } else {
                MessageBox('提示', data.msg);
            }
    }, function (response) {     // 请求失败
        MessageBox('提示', response.data.msg);
    });

    post ES6的语法,直接用解构赋值和剪头函数的方式

    let group_id = this.$route.params.id;
    let data = {
          group_id: group_id,
          mobile: this.mobile,
          code: this.smsCode,
          name: this.memberName
    };
    import {MessageBox} from 'mint-ui';
    this.$http.post(checkUrl, data)
        .then(({data:{code, content, jssdk, msg}}) => {   // 请求成功
            if (code === 0) {
               this.content = content;   // 取到数据
            } else {
                MessageBox('提示', msg);
            }
    }, ({data:{msg}}) => {      // 请求失败
        MessageBox('提示',msg);
    });

    使用解构赋值和剪头函数可以让代码更简洁,使用起来更方便,我们在{data:{code, content, jssdk, msg}}中的数据,实际上是JS引擎把promise给你的参数结构了,因此,你可以直接取到。
    需要注意的是,第一个“MessageBox('提示', msg);”中的msg和第二个“MessageBox('提示',msg);”中的msg不是同一个,第一个是成功的msg,第二个是失败的msg。

    将post请求方式改成get请求方式的语法(一)

    拼接一个参数:

    const checkUrl = 'plank-show/start?start_at=' + (new Date()).valueOf();
    this.$http.get(checkUrl)
         .then(({data:{code, content, jssdk, msg}}) => {
              if (code == 0) {
                   MessageBox('提示', msg);
              } else {
                   MessageBox('提示', msg);
             }
        }, ({data:{msg}}) => {
             MessageBox('提示', msg);
       });

    将post请求方式改成get请求方式的语法(二)

    拼接多个参数:

    let queryData = this.$route.query;
    let dataUrl = "member/coach?group_id=" + queryData.my_group_id + "&id=" + queryData.cheer_id;
    this.$http.get(dataUrl)
          .then(({data:{code, content, jssdk, msg}}) => {
              if (code === 0) {
                   this.content = content;
              } else {
                   MessageBox('提示', msg)
              }
         }, ({data:{msg}}) => {
               MessageBox('提示', msg);
         });
    你对生活笑,生活不会对你哭。
  • 相关阅读:
    CSS流式布局 仿京东
    Flex 实现仿 携程网 手机端布局
    JS 实现 微信随机发红包思路
    记录gradle 使用笔记
    springBoot入门
    支付宝当面付扫码支付功能详解
    微信验证以及登录流程
    Nginx配置文件详细说明
    crontab定时任务打包备份文件并删除过期文件
    关于List比较好玩的操作
  • 原文地址:https://www.cnblogs.com/adanxiaobo/p/8017833.html
Copyright © 2011-2022 走看看