最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

vue+axios+promise實(shí)際開(kāi)發(fā)用法詳解

 更新時(shí)間:2018年10月15日 09:11:43   作者:羊先生  
這篇文章主要介紹了vue+axios+promise實(shí)際開(kāi)發(fā)用法詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

axios它是基于promise的http庫(kù),可運(yùn)行在瀏覽器端和node.js中,然后作者尤雨溪也是果斷放棄了對(duì)其官方庫(kù)vue-resource的維護(hù),直接推薦axios庫(kù),小編我也是從vue-resource轉(zhuǎn)換過(guò)來(lái)的,差別說(shuō)不來(lái),我們講一下axios在實(shí)際開(kāi)發(fā)中的用法

axios特點(diǎn)

1.從瀏覽器中創(chuàng)建 XMLHttpRequests
2.從 node.js 創(chuàng)建 http 請(qǐng)求
3.支持 Promise API
4.攔截請(qǐng)求和響應(yīng) (就是有interceptor)
5.轉(zhuǎn)換請(qǐng)求數(shù)據(jù)和響應(yīng)數(shù)據(jù)
6.取消請(qǐng)求
7.自動(dòng)轉(zhuǎn)換 JSON 數(shù)據(jù)
8.客戶端支持防御 XSRF

安裝axios和qs

npm i axios --save
npm i qs--save

創(chuàng)建項(xiàng)公共模塊API

我是用vue-cli創(chuàng)建的項(xiàng)目在src->util->api.js(公共請(qǐng)求模塊js)

引入axios和qs

import axios from 'axios'

有時(shí)候向后端發(fā)送數(shù)據(jù),后端無(wú)法接收,考慮使用qs模塊

import qs from 'qs'

判定開(kāi)發(fā)模式

if (process.env.NODE_ENV == 'development') {  

  axios.defaults.baseURL = '/api';

}else if (process.env.NODE_ENV == 'debug') {  

  axios.defaults.baseURL = 'http://v.juhe.cn';

}else if (process.env.NODE_ENV == 'production') {  

  axios.defaults.baseURL = 'http://v.juhe.cn';

}

全局設(shè)置頭部信息

axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8';

全局設(shè)置超時(shí)時(shí)間

axios.defaults.timeout = 10000;

請(qǐng)求路由攔截

在請(qǐng)求發(fā)出去之前,可以做一些判斷,看是否是合法用戶

axios.interceptors.request.use(function (config) {
  // 一般在這個(gè)位置判斷token是否存在
  return config;
  }, function (error) {
  // 對(duì)請(qǐng)求錯(cuò)誤做些什么
  return Promise.reject(error);
});

響應(yīng)攔截

axios.interceptors.response.use(function (response){
   // 處理響應(yīng)數(shù)據(jù)
  if (response.status === 200) {      
    return Promise.resolve(response);    
  } else {      
    return Promise.reject(response);    
  }
  }, function (error){
  // 處理響應(yīng)失敗
  return Promise.reject(error);
});

封裝請(qǐng)求方法

使用ES6模塊化export導(dǎo)出import導(dǎo)入

在ES6前, 前端就使用RequireJS或者seaJS實(shí)現(xiàn)模塊化, requireJS是基于AMD規(guī)范的模塊化庫(kù), 而像seaJS是基于CMD規(guī)范的模塊化庫(kù), 兩者都是為了為了推廣前端模塊化的工具,現(xiàn)在ES6自帶了模塊化,不過(guò)現(xiàn)代瀏覽器對(duì)模塊(module)支持程度不同, 需要使用babelJS, 或者Traceur把ES6代碼轉(zhuǎn)化為兼容ES5版本的js代碼;

get請(qǐng)求

export function get(url, params){  
  return new Promise((resolve, reject) =>{    
    axios.get(url, {      
      params: params    
    }).then(res => {
      resolve(res.data);
    }).catch(err =>{
      reject(err.data)    
    })  
  });
}

post請(qǐng)求

export function post(url, params) {
  return new Promise((resolve, reject) => {
     axios.post(url, qs.stringify(params))
    .then(res => {
      resolve(res.data);
    })
    .catch(err =>{
      reject(err.data)
    })
  });
}

實(shí)際使用

在main.js中引入js

import {get,post} from './utils/api'
//將方法掛載到Vue原型上
Vue.prototype.get = get;
Vue.prototype.post = post;

配置請(qǐng)求環(huán)境

這里通過(guò)devServer請(qǐng)求代理

當(dāng)在請(qǐng)求過(guò)程中有/api字符串會(huì)自動(dòng)轉(zhuǎn)換為目標(biāo)服務(wù)器地址(target)

devServer: {
  historyApiFallback: true,
  hot: true,
  inline: true,
  stats: { colors: true },
  proxy: {
   //匹配代理的url
   '/api': {
     // 目標(biāo)服務(wù)器地址
       target: 'http://v.juhe.cn',
       //路徑重寫
       pathRewrite: {'^/api' : ''},
       changeOrigin: true,
       secure: false,
      }
   },
  disableHostCheck:true
  }

這是請(qǐng)求聚合數(shù)據(jù)的接口為列子

this.get('/toutiao/index?type=top&key=秘鑰',{})
  .then((res)=>{
    if(res.error_code===0){
      resolve(res);
    }else{
      //這里拋出的異常被下面的catch所捕獲
      reject(error);
    }
  })
  .catch((err)=>{
    console.log(err)
  })

返回?cái)?shù)據(jù)

使用promise

1.比如用戶想請(qǐng)求url1接口完后再調(diào)url2接口

  var promise = new Promise((resolve,reject)=>{
    let url1 = '/toutiao/index?type=top&key=秘鑰'
    this.get(url,{})
    .then((res)=>{
      resolve(res);
    })
    .catch((err)=>{
      console.log(err)
    })
  });
  promise.then((res)=>{
    let url2 = '/toutiao/index?type=top&key=秘鑰'
    this.get(ur2,{})
    .then((res)=>{
      //只有當(dāng)url1請(qǐng)求到數(shù)據(jù)后才會(huì)調(diào)用url2,否則等待
      resolve(res);
    })
    .catch((err)=>{
      console.log(err)
    })
  })

Promise對(duì)象

  • Promise有三種狀態(tài)
  • pending: 等待中,或者進(jìn)行中,表示還沒(méi)有得到結(jié)果
  • resolved: 已經(jīng)完成,表示得到了我們想要的結(jié)果,可以繼續(xù)往下執(zhí)行
  • rejected: 也表示得到結(jié)果,但是由于結(jié)果并非我們所愿,因此拒絕執(zhí)(用catch捕獲異常)

這三種狀態(tài)不受外界影響,而且狀態(tài)只能從pending改變?yōu)閞esolved或者rejected,并且不可逆(顧名思義承諾的后的東西怎么又能返回呢)。在Promise對(duì)象的構(gòu)造函數(shù)中,將一個(gè)函數(shù)作為第一個(gè)參數(shù)。而這個(gè)函數(shù),就是用來(lái)處理Promise的狀態(tài)變化

這里要注意,不管是then或者catch返回的都是一個(gè)新的Promise實(shí)例!而每個(gè)Primise實(shí)例都有最原始的Pending(進(jìn)行中)到Resolve(已完成),或者Pending(進(jìn)行中)到Reject(已失?。┑倪^(guò)程

Promise基本用法

Promise.all()用法

var p = Promise.all([p1, p2, p3]);

all()接受數(shù)組作為參數(shù)。p1,p2,p3都是Promise的實(shí)例對(duì)象,p要變成Resolved狀態(tài)需要p1,p2,p3狀態(tài)都是Resolved,如果p1,p2,p3至少有一個(gè)狀態(tài)是Rejected,p就會(huì)變成Rejected狀態(tài)

Promise.race()用法

var p = new Promise( [p1,p2,p3] )

只要p1、p2、p3之中有一個(gè)實(shí)例率先改變狀態(tài),p的狀態(tài)就跟著改變。那個(gè)率先改變的 Promise 實(shí)例的返回值,就傳遞給p的回調(diào)函數(shù),p的狀態(tài)就會(huì)改變Resolved狀態(tài)

Promise resolve()用法

Promise.resolve('foo')
// 等價(jià)于
new Promise(resolve => resolve('foo'))

有時(shí)需要將現(xiàn)有對(duì)象轉(zhuǎn)為Promise對(duì)象,Promise.resolve方法就起到這個(gè)作用.

Promise reject()用法

Promise.reject('foo')
// 等價(jià)于
new Promise(reject => reject('foo'))

Promise.reject(reason)方法也會(huì)返回一個(gè)新的 Promise 實(shí)例,該實(shí)例的狀態(tài)為rejected。但是Promise.reject()方法的參數(shù),會(huì)原封不動(dòng)地作為reject的理由,變成后續(xù)方法的參數(shù)。這一點(diǎn)與Promise.resolve方法不一致。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • elementUI給el-tabs/el-tab-pane添加圖標(biāo)效果實(shí)例

    elementUI給el-tabs/el-tab-pane添加圖標(biāo)效果實(shí)例

    這篇文章主要給大家介紹了關(guān)于elementUI給el-tabs/el-tab-pane添加圖標(biāo)效果實(shí)例的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用elementUI具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2023-07-07
  • elementui實(shí)現(xiàn)預(yù)覽圖片組件二次封裝

    elementui實(shí)現(xiàn)預(yù)覽圖片組件二次封裝

    這篇文章主要介紹了elementui實(shí)現(xiàn)預(yù)覽圖片組件二次封裝的方法 ,幫助大家更好的理解和使用vue框架,感興趣的朋友可以了解下
    2020-12-12
  • Vue.js slot插槽的作用域插槽用法詳解

    Vue.js slot插槽的作用域插槽用法詳解

    這篇文章主要介紹了Vue.js slot插槽的作用域插槽用法詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • vue 監(jiān)聽(tīng)是否切屏和開(kāi)啟小窗的實(shí)現(xiàn)過(guò)程

    vue 監(jiān)聽(tīng)是否切屏和開(kāi)啟小窗的實(shí)現(xiàn)過(guò)程

    這篇文章主要介紹了vue 監(jiān)聽(tīng)是否切屏和開(kāi)啟小窗的過(guò)程,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-04-04
  • vue3使用自定義指令實(shí)現(xiàn)el dialog拖拽功能示例詳解

    vue3使用自定義指令實(shí)現(xiàn)el dialog拖拽功能示例詳解

    這篇文章主要為大家介紹了vue3使用自定義指令實(shí)現(xiàn)el dialog拖拽功能示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • Vue3使用hooks解決字典數(shù)據(jù)的顯示問(wèn)題

    Vue3使用hooks解決字典數(shù)據(jù)的顯示問(wèn)題

    我們?cè)谑褂?nbsp;element-plus的時(shí)候,經(jīng)常會(huì)使用一些字典數(shù)據(jù), 在搜索框的時(shí)候,字典數(shù)數(shù)要使用 el-select el-option 來(lái)顯示,但是經(jīng)常會(huì)遇到字典數(shù)據(jù)的顯示問(wèn)題,所以本文給大家介紹了Vue3使用hooks解決字典數(shù)據(jù)的顯示問(wèn)題,需要的朋友可以參考下
    2024-12-12
  • webpack項(xiàng)目調(diào)試以及獨(dú)立打包配置文件的方法

    webpack項(xiàng)目調(diào)試以及獨(dú)立打包配置文件的方法

    下面小編就為大家分享一篇webpack項(xiàng)目調(diào)試以及獨(dú)立打包配置文件的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-02-02
  • axios進(jìn)階實(shí)踐之利用最優(yōu)雅的方式寫ajax請(qǐng)求

    axios進(jìn)階實(shí)踐之利用最優(yōu)雅的方式寫ajax請(qǐng)求

    之前給大家介紹了jQuery利用最優(yōu)雅的方式寫ajax請(qǐng)求的相關(guān)內(nèi)容,這篇文章主要給大家介紹了關(guān)于axios進(jìn)階實(shí)踐之利用最優(yōu)雅的方式寫ajax請(qǐng)求的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。
    2017-12-12
  • 詳解Vue.js使用Swiper.js在iOS<11時(shí)出現(xiàn)錯(cuò)誤

    詳解Vue.js使用Swiper.js在iOS<11時(shí)出現(xiàn)錯(cuò)誤

    這篇文章主要介紹了詳解Vue.js使用Swiper.js在iOS<11時(shí)出現(xiàn)錯(cuò)誤,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-09-09
  • 詳解vue 數(shù)組和對(duì)象渲染問(wèn)題

    詳解vue 數(shù)組和對(duì)象渲染問(wèn)題

    這篇文章主要介紹了詳解vue 數(shù)組和對(duì)象渲染問(wèn)題,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-09-09

最新評(píng)論

宜阳县| 秀山| 无棣县| 黄骅市| 赤城县| 沛县| 资溪县| 云梦县| 奉节县| 龙海市| 长白| 铜陵市| 汾西县| 延吉市| 仁怀市| 临邑县| 广南县| 高安市| 托克托县| 镇坪县| 达尔| 赤壁市| 雅江县| 岱山县| 英山县| 林芝县| 金坛市| 安泽县| 扶绥县| 天峨县| 桑日县| 台江县| 东台市| 晋州市| 万载县| 二连浩特市| 武冈市| 宜黄县| 阿尔山市| 遵化市| 威信县|