vue-resource調(diào)用promise取數(shù)據(jù)方式詳解
用了好久的vue-resource,好像每一次使用的時(shí)候,都要去看一下上一次是怎么寫的,具體的語法過不了多久又忘記了,甚至不知道其中的原理,只知道一些簡單的使用,一會(huì)兒用ES6的語法,一會(huì)兒又用傳統(tǒng)的語法,為了改變這種不良的習(xí)慣,并理清vue-resource使用promise取數(shù)據(jù)的原理,今天把這一塊整理一下。
先來說說 vue-resource
vue-resource是Vue.js的一款插件,它可以通過XMLHttpRequest或JSONP發(fā)起請求并處理響應(yīng)。也就是說,$.ajax能做的事情,vue-resource插件一樣也能做到,而且vue-resource的API更為簡潔。
vue-resource的優(yōu)勢和介紹,可以通過下面這個(gè)地址來了解。
vue-resource的API分別有以下這些:
- http get
- http jsonp
- http post
- http put
- http delete
- resource get
- resource save
- resource update
- resource remove
- inteceptor
我現(xiàn)在的工作中,常用的就是get和post。
引入vue-resource后,可以基于全局的Vue對象使用http,也可以基于某個(gè)Vue實(shí)例使用http?,F(xiàn)在的項(xiàng)目中,基本上都是后者,因此在不同組件的beforeCreate或mounted鉤子中取。
// 基于全局Vue對象使用http
Vue.http.get('/someUrl', [options]).then(successCallback, errorCallback);
Vue.http.post('/someUrl', [body], [options]).then(successCallback, errorCallback);
// 在一個(gè)Vue實(shí)例內(nèi)使用$http
this.$http.get('/someUrl', [options]).then(successCallback, errorCallback);
this.$http.post('/someUrl', [body], [options]).then(successCallback, errorCallback);
在發(fā)送請求后,使用then方法來處理響應(yīng)結(jié)果,then方法有兩個(gè)參數(shù),第一個(gè)參數(shù)是響應(yīng)成功時(shí)的回調(diào)函數(shù),第二個(gè)參數(shù)是響應(yīng)失敗時(shí)的回調(diào)函數(shù)。
vue-resource支持Promise API,Promise是ES6的特性,Promise的中文含義為“先知”,Promise對象用于異步計(jì)算。
再簡單介紹一下Promise對象
ES6原生提供了Promise對象。所謂Promise對象,就是代表了未來某個(gè)將要發(fā)生的事件(通常是一個(gè)異步操作)。它的好處在于,有了Promise對象,就可以將異步操作以同步操作的流程表達(dá)出來,避免了層層嵌套的回調(diào)函數(shù)。此外,Promise對象還提供了一整套完整的接口,使得可以更加容易地控制異步操作。Promise對象的概念的詳細(xì)解釋,請參考《JavaScript標(biāo)準(zhǔn)參考教程》。
ES6的Promise對象是一個(gè)構(gòu)造函數(shù),用來生成Promise實(shí)例。下面是Promise對象的基本用法。
var promise = new Promise(function(resolve, reject) {
if (/* 異步操作成功 */){
resolve(value);
} else {
reject(error);
}
});
promise.then(function(value) {
// success
}, function(value) {
// failure
});
下面我們來直接使用:
假如我們請求下面這個(gè)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": "錯(cuò)誤信息",
"content": "",
"is_mobile_user": true,
"jssdk": {
"appId": "wxec4d172a4f73ee6f",
"timestamp": "1487750749",
"nonceStr": "58ad465dd5ba5",
"signature": "4aa01f5a89ce79ee4c53249e0cdb84800f841004"
}
}
get 傳統(tǒng)的寫法
import {MessageBox} from 'mint-ui';
this.$http.get(dataUrl)
.then(function (response) { // 請求成功
let data = response.data;
if (data.code === 0) {
this.content = data.content; // 取到數(shù)據(jù)
} else {
MessageBox('提示', data.msg);
}
}, function (response) { // 請求失敗
MessageBox('提示', response.data.msg);
})
get ES6的語法 直接用解構(gòu)賦值和剪頭函數(shù)的方式
import {MessageBox} from 'mint-ui';
this.$http.get(dataUrl)
.then(({data:{code, content, jssdk, msg}}) => { // 請求成功
if (data.code === 0) {
this.content = content; // 取到數(shù)據(jù)
} else {
MessageBox('提示', msg);
}
}, ({data:{msg}}) => { // 請求失敗
MessageBox('提示',msg);
});
post 傳統(tǒng)的語法
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; // 取到數(shù)據(jù)
} else {
MessageBox('提示', data.msg);
}
}, function (response) { // 請求失敗
MessageBox('提示', response.data.msg);
});
post ES6的語法,直接用解構(gòu)賦值和剪頭函數(shù)的方式
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; // 取到數(shù)據(jù)
} else {
MessageBox('提示', msg);
}
}, ({data:{msg}}) => { // 請求失敗
MessageBox('提示',msg);
});
使用解構(gòu)賦值和剪頭函數(shù)可以讓代碼更簡潔,使用起來更方便,我們在{data:{code, content, jssdk, msg}}中的數(shù)據(jù),實(shí)際上是JS引擎把promise給你的參數(shù)結(jié)構(gòu)了,因此,你可以直接取到。
需要注意的是,第一個(gè)“MessageBox('提示', msg);”中的msg和第二個(gè)“MessageBox('提示',msg);”中的msg不是同一個(gè),第一個(gè)是成功的msg,第二個(gè)是失敗的msg。
將post請求方式改成get請求方式的語法(一)
拼接一個(gè)參數(shù):
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請求方式的語法(二)
拼接多個(gè)參數(shù):
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);
});
以上這些,基本上夠我現(xiàn)在在項(xiàng)目中使用,使用多次之后,會(huì)發(fā)現(xiàn)將 vue-resource、promise、ES6語法結(jié)合使用,真的很簡單很清淅,在以后的工作中,如果遇到了其他的需求,再補(bǔ)上整理后內(nèi)容。
希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
淺談vue-cli加載不到dev-server.js的解決辦法
本篇文章主要介紹了淺談vue-cli加載不到dev-server.js的解決辦法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-11-11
用Vue-cli搭建的項(xiàng)目中引入css報(bào)錯(cuò)的原因分析
本篇文章主要介紹了用Vue-cli搭建的項(xiàng)目中引入css報(bào)錯(cuò)的原因分析,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07
vue-resource post數(shù)據(jù)時(shí)碰到Django csrf問題的解決
這篇文章主要介紹了vue-resource post數(shù)據(jù)時(shí)碰到Django csrf問題的解決,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03
使用Vue3+ElementPlus前端實(shí)現(xiàn)分片上傳的全過程
ElementPlus是一套為開發(fā)者、設(shè)計(jì)師和產(chǎn)品經(jīng)理準(zhǔn)備的基于Vue?3.0的組件庫,提供了配套設(shè)計(jì)資源,幫助你的網(wǎng)站快速成型,下面這篇文章主要給大家介紹了關(guān)于使用Vue3+ElementPlus前端實(shí)現(xiàn)分片上傳的相關(guān)資料,需要的朋友可以參考下2022-11-11

