成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

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

羅志環(huán) / 2921人閱讀

摘要:都是的實(shí)例對(duì)象,要變成狀態(tài)需要,,狀態(tài)都是,如果至少有一個(gè)狀態(tài)是,就會(huì)變成狀態(tài)用法只要之中有一個(gè)實(shí)例率先改變狀態(tài),的狀態(tài)就跟著改變。這一點(diǎn)與方法不一致。

axios它是基于promise的http庫,可運(yùn)行在瀏覽器端和node.js中,然后作者尤雨溪也是果斷放棄了對(duì)其官方庫vue-resource的維護(hù),直接推薦axios庫,小編我也是從vue-resource轉(zhuǎn)換過來的,差別說不來,我們講一下axios在實(shí)際開發(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ù),后端無法接收,考慮使用qs模塊

import qs from "qs"

判定開發(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ī)范的模塊化庫, 而像seaJS是基于CMD規(guī)范的模塊化庫, 兩者都是為了為了推廣前端模塊化的工具,現(xiàn)在ES6自帶了模塊化,不過現(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)境
這里通過devServer請(qǐng)求代理
當(dāng)在請(qǐng)求過程中有/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)行中,表示還沒有得到結(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ù),就是用來處理Promise的狀態(tài)變化

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

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方法不一致。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/98357.html

相關(guān)文章

  • vue axios 簡(jiǎn)單封裝以及思考

    摘要:先安裝的詳細(xì)介紹以及用法就不多說了請(qǐng)移步下面是簡(jiǎn)單的封裝一個(gè),在此說明這個(gè)方法呢是不一定需要的,根據(jù)個(gè)人的項(xiàng)目需求吧,也可以直接返回,交給后面另行處理也行?;蛘吒鶕?jù)后端返回的狀態(tài),在里面進(jìn)行處理也行。先安裝 axios npm install axios axios的詳細(xì)介紹以及用法 就不多說了請(qǐng) 移步 github ??? https://github.com/axios/axios ...

    phoenixsky 評(píng)論0 收藏0
  • Vue中如何使用axios請(qǐng)求攔截

    摘要:很多初學(xué)者就會(huì)放棄使用攔截器,畢竟攔截器是可以不使用的,但是使用攔截器,會(huì)在頁面中減少很多不必要的代碼。三不使用請(qǐng)求攔截如果不使用請(qǐng)求攔截,也是可以的,但是會(huì)多了非常多的代碼,我們以登錄頁為例。 一、前言 axios的基礎(chǔ)使用就不過多的講解啦,如何使用可以看axios文檔使用說明·Axios中文說明 在這里和大家分享一下axios攔截在實(shí)際項(xiàng)目中的使用 很多人都看過axios的官方文...

    _Dreams 評(píng)論0 收藏0
  • 后端開發(fā)者的Vue學(xué)習(xí)之路(五)

    摘要:由服務(wù)器提供的響應(yīng)來自服務(wù)器響應(yīng)的狀態(tài)碼來自服務(wù)器響應(yīng)的狀態(tài)信息服務(wù)器響應(yīng)的頭是為請(qǐng)求提供的配置信息所以請(qǐng)求返回后,我們可以通過來獲取響應(yīng)情況。攔截器攔截器攔截器用于攔截發(fā)起的請(qǐng)求或用于攔截返回的響應(yīng)。目錄 上節(jié)內(nèi)容回顧 使用第三方組件庫 如何發(fā)起請(qǐng)求 請(qǐng)求錯(cuò)誤處理 請(qǐng)求帶參 ...

    jay_tian 評(píng)論0 收藏0
  • vue-cli中怎么基于axios去封裝方法

    摘要:大家好,我是,潛水于掘金和思否的一名前端小小生,今天看了幾篇文章關(guān)于中怎么去封裝,視乎好多版本都是基于去做的。 **大家好,我是minijie,潛水于掘金和思否的一名前端小小生,今天看了幾篇文章關(guān)于vue中怎么去封裝axios,視乎好多版本都是基于promise去做的。這讓我很疑惑,axios不就是基于promise的一個(gè)請(qǐng)求庫嗎?為啥還要多一層promise呢?下面是根據(jù)我自己的想法...

    baiy 評(píng)論0 收藏0
  • 從0到1使用VUE-CLI3開發(fā)實(shí)戰(zhàn)(四): Axios封裝

    摘要:從到使用開發(fā)實(shí)戰(zhàn)四封裝有很多同學(xué)看了本系列的前幾篇之后建議我暫時(shí)先不用,于是小肆之后將把換成繼續(xù)下面的文章。前置閱讀用從到做一個(gè)完整功能手機(jī)站一從到開發(fā)實(shí)戰(zhàn)手機(jī)站二提交規(guī)范配置從到使用開發(fā)實(shí)戰(zhàn)三知識(shí)儲(chǔ)備 從0到1使用VUE-CLI3開發(fā)實(shí)戰(zhàn)(四): Axios封裝 有很多同學(xué)看了本系列的前幾篇之后建議我暫時(shí)先不用TS,于是小肆之后將把TS換成JS繼續(xù)下面的文章。今天給大家?guī)眄?xiàng)目中非常...

    ThinkSNS 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<