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


Posted in Javascript onJuly 21, 2017

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

先来说说 vue-resource

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

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

希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
贴一个在Mozilla中常用的Javascript代码
Jan 09 Javascript
javascript 密码强弱度检测万能插件
Feb 25 Javascript
js中array的sort()方法使用介绍
Feb 20 Javascript
Jquery基础教程之DOM操作
Aug 19 Javascript
jQuery实现大转盘抽奖活动仿QQ音乐代码分享
Aug 21 Javascript
基于jQuery实现淡入淡出效果轮播图
Jul 31 Javascript
Bootstrap导航条可点击和鼠标悬停显示下拉菜单
Nov 25 Javascript
javascript数据结构之串的概念与用法分析
Apr 12 Javascript
vue中的router-view组件的使用教程
Oct 23 Javascript
electron中使用bootstrap的示例代码
Nov 06 Javascript
react-router 路由切换动画的实现示例
Dec 03 Javascript
javascript中contains是否包含功能实现代码(扩展字符、数组、dom)
Apr 07 Javascript
Vue resource中的GET与POST请求的实例代码
Jul 21 #Javascript
Angular+Bootstrap+Spring Boot实现分页功能实例代码
Jul 21 #Javascript
es7学习教程之Decorators(修饰器)详解
Jul 21 #Javascript
VUE中使用Vue-resource完成交互
Jul 21 #Javascript
es7学习教程之fetch解决异步嵌套问题的方法示例
Jul 21 #Javascript
js图片轮播插件的封装
Jul 21 #Javascript
Javascript es7中比较实用的两个方法示例
Jul 21 #Javascript
You might like
php 变量定义方法
2009/06/14 PHP
php设计模式 Interpreter(解释器模式)
2011/06/26 PHP
什么是PEAR?什么是PECL?PHP中两个容易混淆的概念解释
2015/07/01 PHP
php nginx 实时输出的简单实现方法
2018/01/21 PHP
让js弹出窗口居前显示的实现方法
2013/07/10 Javascript
新增加的内容是如何将div的scrollbar自动移动最下面
2014/01/02 Javascript
使用javascript控制cookie显示和隐藏背景图
2014/02/12 Javascript
jquery实现的鼠标下拉滚动置顶效果
2014/07/24 Javascript
分分钟玩转Vue.js组件(二)
2017/03/01 Javascript
最通俗易懂的javascript变量提升详解
2017/08/05 Javascript
vue2.0 如何把子组件的数据传给父组件(推荐)
2018/01/15 Javascript
使用flow来规范javascript的变量类型
2019/09/12 Javascript
微信小程序实现一张或多张图片上传(云开发)
2019/09/25 Javascript
layui: layer.open加载窗体时出现遮罩层的解决方法
2019/09/26 Javascript
小程序点击图片实现png转jpg
2019/10/22 Javascript
python虚拟环境 virtualenv的简单使用
2020/01/21 Javascript
jquery实现烟花效果(面向对象)
2020/03/10 jQuery
详解Vue中的自定义指令
2020/12/07 Vue.js
python刷投票的脚本实现代码
2014/11/08 Python
Python实现将一个大文件按段落分隔为多个小文件的简单操作方法
2017/04/17 Python
Python编程使用tkinter模块实现计算器软件完整代码示例
2017/11/29 Python
Python cookbook(数据结构与算法)找到最大或最小的N个元素实现方法示例
2018/02/13 Python
pygame游戏之旅 添加键盘按键的方法
2018/11/20 Python
Python插入Elasticsearch操作方法解析
2020/01/19 Python
解决TensorFlow训练内存不断增长,进程被杀死问题
2020/02/05 Python
Django执行源生mysql语句实现过程解析
2020/11/12 Python
中学教师培训制度
2014/01/31 职场文书
酒店端午节促销方案
2014/02/18 职场文书
软件项目开发计划书
2014/05/01 职场文书
志愿者个人总结
2015/03/03 职场文书
2015年度个人教学工作总结
2015/05/20 职场文书
2015年体检中心工作总结
2015/05/27 职场文书
钱学森电影观后感
2015/06/04 职场文书
卫生主题班会
2015/08/14 职场文书
mysql的Buffer Pool存储及原理
2022/04/02 MySQL
Win10玩csgo闪退如何解决?Win10玩csgo闪退的解决方法
2022/07/23 数码科技