用了好久的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分别有以下这些:
我现在的工作中,常用的就是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语法结合使用,真的很简单很清淅,在以后的工作中,如果遇到了其他的需求,再补上整理后内容。
希望对大家的学习有所帮助,也希望大家多多支持。
# vue
# resource
# promise
# vueresource
# resource调用
# vue中promise的使用及异步请求数据的方法
# Vue使用vue-recoure + http-proxy-middleware + vuex配合p
# vue+axios+promise实际开发用法详解
# Vue Promise的axios请求封装详解
# 详解vue-resource promise兼容性问题
# vue中Promise的使用方法详情
# 第一个
# 第二个
# 是一个
# 回调
# 我现在
# 会儿
# 的是
# 都是
# 这一
# 你可以
# 都要
# 多个
# 是怎么
# 也能
# 其他的
# 真的很
# 可以通过
# 用了
# 去看
# 它可以
相关文章:
如何配置FTP站点权限与安全设置?
建站主机是否属于云主机类型?
大型企业网站制作流程,做网站需要注册公司吗?
如何通过远程VPS快速搭建个人网站?
免费ppt制作网站,有没有值得推荐的免费PPT网站?
如何做静态网页,sublimetext3.0制作静态网页?
义乌企业网站制作公司,请问义乌比较好的批发小商品的网站是什么?
网站微信制作软件,如何制作微信链接?
如何获取免费开源的自助建站系统源码?
MySQL查询结果复制到新表的方法(更新、插入)
SAX解析器是什么,它与DOM在处理大型XML文件时有何不同?
如何用搬瓦工VPS快速搭建个人网站?
长沙做网站要多少钱,长沙国安网络怎么样?
威客平台建站流程解析:高效搭建教程与设计优化方案
教学网站制作软件,学习*后期制作的网站有哪些?
如何构建满足综合性能需求的优质建站方案?
h5在线制作网站电脑版下载,h5网页制作软件?
建站主机默认首页配置指南:核心功能与访问路径优化
如何通过WDCP绑定主域名及创建子域名站点?
如何快速查询网站的真实建站时间?
如何通过多用户协作模板快速搭建高效企业网站?
简历在线制作网站免费,免费下载个人简历的网站是哪些?
宝塔面板如何快速创建新站点?
制作营销网站公司,淘特是干什么用的?
湖北网站制作公司有哪些,湖北清能集团官网?
Bpmn 2.0的XML文件怎么画流程图
免费网站制作模板下载,除了易企秀之外还有什么H5平台可以制作H5长页面,最好是免费的?
制作销售网站教学视频,销售网站有哪些?
详解jQuery停止动画——stop()方法的使用
相册网站制作软件,图片上的网址怎么复制?
建站之星后台搭建步骤解析:模板选择与产品管理实操指南
兔展官网 在线制作,怎样制作微信请帖?
高防服务器:AI智能防御DDoS攻击与数据安全保障
成都响应式网站开发,dw怎么把手机适应页面变成网页?
金*站制作公司有哪些,金华教育集团官网?
如何通过虚拟主机空间快速建站?
如何通过wdcp面板快速创建网站?
电商网站制作价格怎么算,网上拍卖流程以及规则?
如何在万网自助建站平台快速创建网站?
东莞专业制作网站的公司,东莞大学生网的网址是什么?
专业的网站制作设计是什么,如何制作一个企业网站,建设网站的基本步骤有哪些?
香港服务器选型指南:免备案配置与高效建站方案解析
ppt在线制作免费网站推荐,有什么下载免费的ppt模板网站?
如何在阿里云ECS服务器部署织梦CMS网站?
网站图片在线制作软件,怎么在图片上做链接?
头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?
建站之星安装后如何自定义网站颜色与字体?
广州美橙建站如何快速搭建多端合一网站?
营销式网站制作方案,销售哪个网站招聘效果最好?
如何在Windows服务器上快速搭建网站?
*请认真填写需求信息,我们会在24小时内与您取得联系。