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

用了好久的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语法结合使用,真的很简单很清淅,在以后的工作中,如果遇到了其他的需求,再补上整理后内容。

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

(0)

相关推荐

  • 详解vue-resource promise兼容性问题

    背景 其实这个问题在之前的项目开发中就出现过,但是当初只解决问题了,并没有针对问题作总结:于是乎今天踩到了自己埋的坑,所以决定记录一下.那么到底是什么问题呢?就是"在安卓低版本,如果你在vue项目中使用了vue-resource(vue-resource是什么?它是一个具有ajax功能的第三方npm包),那么http请求和响应都是正常的,但是,注意,但是来了啊!!但是响应进不去promise回调",下面我们来具体看一下 正题 一.Vue Resource如何使用? 大家都知道,我们在v

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

    用了好久的vue-resource,好像每一次使用的时候,都要去看一下上一次是怎么写的,具体的语法过不了多久又忘记了,甚至不知道其中的原理,只知道一些简单的使用,一会儿用ES6的语法,一会儿又用传统的语法,为了改变这种不良的习惯,并理清vue-resource使用promise取数据的原理,今天把这一块整理一下. 先来说说 vue-resource vue-resource是Vue.js的一款插件,它可以通过XMLHttpRequest或JSONP发起请求并处理响应.也就是说,$.ajax能做的

  • 对Python 除法负数取商的取整方式详解

    python除法负数商的取整方式与C++不同 python: 5 / -2 = -3 若想和C++行为相同,可以使用 int(operator.truediv(num1, num2)) 返回 a/ b (当启用future.division 时. )这也被称为正除法 python 几种常用的取整方式 1.向下取整 a = 3.75 int(a) 3 2.四舍五入 a = 3.25; b = 3.75 round(a); round(b) 3.0 4.0 3.向上取整 import math a

  • Vue配置文件中的proxy配置方式详解

    1. 这里以axios发请求为例 axios.get("/abc/def"); axios.get("/abc/ghi"); axios.post("/abc/jkm"); axios发送的请求是本地的服务器地址拼接上发送的请求,如 http://localhost:8080/abc/def 2. 如果发送的请求都以 /abc 开头,那么我们就可以在proxy中进行服务器代理配置. devServer: { proxy: { "/abc

  • Python中调用其他程序的方式详解

    前言 在Python中,可以方便地使用os模块来运行其他脚本或者程序,这样就可以在脚本中直接使用其他脚本或程序提供的功能,而不必再次编写实现该功能的代码.为了更好地控制运行的进程, 可以使用win32process模块中的函数,如果想进一步控制进程,则可以使用ctype模块,直接调用kernel32.dll中的函数.下面介绍4种方式: 1.os.system()函数 os模块中的system()函数可以方便地运行其他程序或者脚本,模式如下: os.system(command):command:

  • vue路由传参三种基本方式详解

    这篇文章主要介绍了vue路由传参三种基本方式详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 现有如下场景,点击父组件的li元素跳转到子组件中,并携带参数,便于子组件获取数据. 父组件中: <li v-for="article in articles" @click="getDescribe(article.id)"> methods: 方案一: getDescribe(id) { // 直接调用$r

  • vue项目中企业微信使用js-sdk时config和agentConfig配置方式详解

    1.如果只使用config配置的相关js接口 可采用如下方式引入 执行 npm weixin-sdk-js --save 局部引入 在vue页面中 import wx from 'weixin-sdk-js'; 全局引入 在vue 的main.js 页面中 引入后编写到vue原型链上,然后全局调用 import wx from "weixin-sdk-js"; Vue.prototype.$wx = wx; 2.如果要使用agentConfig配置的相关接口 一定不要执行npm命令引入

  • Vue echarts模拟后端数据流程详解

    目录 KOA2的使用 安装 Koa app.js入口文件 KOA2的使用 KOA2是由Express 原班人马打造. 环境依赖 Node v7.6.0 及以上. 支持 async 和 await 洋葱模型的中间件 写响应函数(中间件) 响应函数是通过use的方式才能产生效果, 这个函数有两个参数, ctx :上下文, 指的是请求所处于的Web容器,我们可以通过 ctx.request 拿到请求对象, 也可 以通过 ctx.response 拿到响应对象 next :内层中间件执行的入口 模拟服务

  • vue.js前后端数据交互之提交数据操作详解

    本文实例讲述了vue.js前后端数据交互之提交数据操作.分享给大家供大家参考,具体如下: 前端小白刚开始做页面的时候,我们的前端页面中经常会用到表单,所以学会提交表单也是一个基本技能,其实用ajax就能实现,但他的原始语法有点...额 ...复杂,所以这里给大家提供一种用vue-resource向后端提交数据. (1)第一步,先在template中写一个表单: <el-form :model="ruleForm" :rules="rules" ref=&quo

  • 基于Python的Post请求数据爬取的方法详解

    为什么做这个 和同学聊天,他想爬取一个网站的post请求 观察 该网站的post请求参数有两种类型:(1)参数体放在了query中,即url拼接参数(2)body中要加入一个空的json对象,关于为什么要加入空的json对象,猜测原因为反爬虫.既有query参数又有空对象体的body参数是一件脑洞很大的事情. 一开始先在apizza网站 上了做了相关实验才发现上面这个规律的,并发现该网站的请求参数要为raw形式,要是直接写代码找规律不是一件容易的事情. 源码 import requests im

  • Vue.js中对css的操作(修改)具体方式详解

    使用v-bind:class或者v-bind:style或者直接通过操作dom来对其样式进行更改: 1.v-bind:class || v-bind:style 其中v-bind是指令,: 后面的class 和style是参数,而class之后的指在vue的官方文档里被称为'指令预期值'(这个不必深究,反正个人觉得初学知道他叫啥名有啥用就好了)同v-bind的大多数指令(部分特殊指令如V-for除外)一样,除了可以绑定字符串类型的变量外,还支持一个单一的js表达式,也就是说v-bind:clas

随机推荐