axios配置fileReader.onload處理異步請求

問題場景:前端通過后端接口下載文件,返回值是一個blob文件,需要通過fileReader.onload()內(nèi)部才能做各種判斷,并且將res.data返回出去,但是fileReader.onload()是一個異步方法,直接reutrn fileReader.onload()是返回undefined。所以問題就是怎么把fileReader.onload()內(nèi)部的變量傳遞出去呢?

一開始是想用閉包,但結(jié)果發(fā)現(xiàn)是undefined,應(yīng)該是fileReader.onload()本身就沒有返回值。結(jié)果就被卡住了。

后來想到一個新辦法。

很簡單,核心就是在第一個.then的處理邏輯中,繼續(xù)返回Promise,然后在下一個Promise的.then中進行return
代碼如下:


/**
 * 下載(post請求)
 * @param {string} url 請求地址
 * @param {object} params 地址參數(shù)
 */
export const downloadPost = async function (url, data = {}, params={}) {
    return await axios.post(url,data, {
        ...params,
        responseType: 'blob',
        headers: {
            'X-AUTH-TOKEN' : getToken(),
        },
    }).then(res => {
        return new Promise((resolve,reject)=>{
            let fileReader = new FileReader();
            fileReader.onload = function () {
                try {
                    let response = JSON.parse(this.result); // 說明是普通對象數(shù)據(jù),后臺轉(zhuǎn)換失敗
                    if(typeof response == 'object') {
                        if (response.code) {
                            Notification.warning({
                                title: '提示',
                                message: `${response.msg}`,
                            })
                            return reject(response)
                        }
                    }else{
                        throw('message');
                    }
                } catch (error) {
                    const name = window.decodeURI(res.headers['content-disposition'].split('=')[1]);
                    if (window.navigator.msSaveBlob) {
                        const blobObject = new Blob([res.data]);
                        window.navigator.msSaveBlob(blobObject, name);
                    } else {
                        let link = document.createElement('a');
                        link.href = window.URL.createObjectURL(res.data);
                        link.download = name;
                        document.body.appendChild(link);
                        link.click();
                        document.body.removeChild(link);
                    }
                    return resolve(res.data)
                }
            };
            fileReader.readAsText(res.data)
        })
    }).then(res=>{
        return res
    }).catch(err=>{
        return Promise.reject(err);
    });
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一、初識jQuery.js jQuery.js是一款優(yōu)秀的JS類庫,其本質(zhì)就是在一個立即執(zhí)行的匿名函數(shù)中的閉包,j...
    劉遠舟閱讀 810評論 1 0
  • 1、離職多久了 2、大約多久到崗 3、離這里多遠 4、會考慮搬家嗎 5、公司會加班 6、為什么要離職 7、你們這個...
    臨淵鯨落閱讀 1,391評論 0 1
  • 1.幾種基本數(shù)據(jù)類型?復(fù)雜數(shù)據(jù)類型?值類型和引用數(shù)據(jù)類型?堆棧數(shù)據(jù)結(jié)構(gòu)? 基本數(shù)據(jù)類型:Undefined、Nul...
    極樂君閱讀 5,878評論 0 106
  • JavaScript 來了 1995年,誕生了JavaScript語言,那一年,我剛剛從大學(xué)畢業(yè)。在今年RedMo...
    abel_cao閱讀 2,238評論 2 54
  • 前端面試問題集錦 JavaScript 部分 1、JQuery $(document).ready() 和 win...
    涯無凌閱讀 980評論 0 2

友情鏈接更多精彩內(nèi)容