欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

vue-resource调用promise取数据方式详解

程序员文章站 2022-05-26 08:31:23
用了好久的vue-resource,好像每一次使用的时候,都要去看一下上一次是怎么写的,具体的语法过不了多久又忘记了,甚至不知道其中的原理,只知道一些简单的使用,一会儿用e...

用了好久的vue-resource,好像每一次使用的时候,都要去看一下上一次是怎么写的,具体的语法过不了多久又忘记了,甚至不知道其中的原理,只知道一些简单的使用,一会儿用es6的语法,一会儿又用传统的语法,为了改变这种不良的习惯,并理清vue-resource使用promise取数据的原理,今天把这一块整理一下。

先来说说 vue-resource

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

vue-resource的优势和介绍,可以通过下面这个地址来了解。

vue.js——vue-resource全攻略

vue-resource的api分别有以下这些:

  1. http get
  2. http jsonp
  3. http post
  4. http put
  5. http delete
  6. resource get
  7. resource save
  8. resource update
  9. resource remove
  10. 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);
   });

以上这些,基本上够我现在在项目中使用,使用多次之后,会发现将 vue-resource、promise、es6语法结合使用,真的很简单很清淅,在以后的工作中,如果遇到了其他的需求,再补上整理后内容。

希望对大家的学习有所帮助,也希望大家多多支持。