中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何在vue中使用axios和promise

發布時間:2021-05-26 09:42:32 來源:億速云 閱讀:311 作者:Leah 欄目:web開發

如何在vue中使用axios和promise?相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

axios它是基于promise的http庫,可運行在瀏覽器端和node.js中,然后作者尤雨溪也是果斷放棄了對其官方庫vue-resource的維護,直接推薦axios庫,小編我也是從vue-resource轉換過來的,差別說不來,我們講一下axios在實際開發中的用法

axios特點

1.從瀏覽器中創建 XMLHttpRequests
2.從 node.js 創建 http 請求
3.支持 Promise API
4.攔截請求和響應 (就是有interceptor)
5.轉換請求數據和響應數據
6.取消請求
7.自動轉換 JSON 數據
8.客戶端支持防御 XSRF

安裝axios和qs

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

創建項公共模塊API

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

引入axios和qs

import axios from 'axios'

有時候向后端發送數據,后端無法接收,考慮使用qs模塊

import qs from 'qs'

判定開發模式

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';

}

全局設置頭部信息

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

全局設置超時時間

axios.defaults.timeout = 10000;

請求路由攔截

在請求發出去之前,可以做一些判斷,看是否是合法用戶

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

響應攔截

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

封裝請求方法

使用ES6模塊化export導出import導入

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

get請求

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請求

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)
    })
  });
}

實際使用

在main.js中引入js

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

配置請求環境

這里通過devServer請求代理

當在請求過程中有/api字符串會自動轉換為目標服務器地址(target)

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

這是請求聚合數據的接口為列子

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)
  })

返回數據

如何在vue中使用axios和promise

使用promise

1.比如用戶想請求url1接口完后再調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)=>{
      //只有當url1請求到數據后才會調用url2,否則等待
      resolve(res);
    })
    .catch((err)=>{
      console.log(err)
    })
  })

Promise對象

  • Promise有三種狀態

  • pending: 等待中,或者進行中,表示還沒有得到結果

  • resolved: 已經完成,表示得到了我們想要的結果,可以繼續往下執行

  • rejected: 也表示得到結果,但是由于結果并非我們所愿,因此拒絕執(用catch捕獲異常)

這三種狀態不受外界影響,而且狀態只能從pending改變為resolved或者rejected,并且不可逆(顧名思義承諾的后的東西怎么又能返回呢)。在Promise對象的構造函數中,將一個函數作為第一個參數。而這個函數,就是用來處理Promise的狀態變化

這里要注意,不管是then或者catch返回的都是一個新的Promise實例!而每個Primise實例都有最原始的Pending(進行中)到Resolve(已完成),或者Pending(進行中)到Reject(已失敗)的過程

Promise基本用法

Promise.all()用法

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

all()接受數組作為參數。p1,p2,p3都是Promise的實例對象,p要變成Resolved狀態需要p1,p2,p3狀態都是Resolved,如果p1,p2,p3至少有一個狀態是Rejected,p就會變成Rejected狀態

Promise.race()用法

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

只要p1、p2、p3之中有一個實例率先改變狀態,p的狀態就跟著改變。那個率先改變的 Promise 實例的返回值,就傳遞給p的回調函數,p的狀態就會改變Resolved狀態

Promise resolve()用法

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

有時需要將現有對象轉為Promise對象,Promise.resolve方法就起到這個作用.

Promise reject()用法

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

Promise.reject(reason)方法也會返回一個新的 Promise 實例,該實例的狀態為rejected。但是Promise.reject()方法的參數,會原封不動地作為reject的理由,變成后續方法的參數。這一點與Promise.resolve方法不一致。

Vue的優點

Vue具體輕量級框架、簡單易學、雙向數據綁定、組件化、數據和結構的分離、虛擬DOM、運行速度快等優勢,Vue中頁面使用的是局部刷新,不用每次跳轉頁面都要請求所有數據和dom,可以大大提升訪問速度和用戶體驗。

看完上述內容,你們掌握如何在vue中使用axios和promise的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

沅江市| 肇源县| 法库县| 内丘县| 增城市| 安徽省| 五台县| 都兰县| 吉首市| 南平市| 永济市| 屏边| 绵竹市| 孝感市| 双江| 宁陵县| 宕昌县| 晋城| 沅江市| 合水县| 潞城市| 横峰县| 旅游| 扶余县| 安宁市| 丽江市| 谢通门县| 丁青县| 潮安县| 林芝县| 社旗县| 慈溪市| 萍乡市| 鄯善县| 榆林市| 修水县| 温州市| 梁河县| 中牟县| 绿春县| 云和县|