zoukankan      html  css  js  c++  java
  • fetch封装

      对fetch方法做简单的封装,完成需要统一处理的功能:antd - Table参数映射;取消短时间内的重复请求;options.params参数拼接到url;options.body转换json;headers.Authorization请求头认证赋值;请求异常统一处理;增删改成功提示

    import {message} from 'antd';
    import _ from '_';
    import {cookieUtil} from './util';
    
    const REQUEST_RECORD = {},
        DEFAULT_REQUEST_INTERVAL = 1000,
        DEFAULT_FETCH_OPTIONS = {
            method: 'GET',
            mode: 'cors',
            headers: {},
        },
        SHOW_MSG_METHOD = {
            POST: true,
            PUT: true,
            DELETE: true,
        };
    
    /**
     * Requests a URL, returning a promise.
     *
     * @param  {string} url       The URL we want to request
     * @param  {object} [options] The options we want to pass to "fetch"
     * @return {object}           An object containing either "data" or "err"
     */
    export default function request(url, options = {}) {
        options = handleTableParams(options);
        if (!isRepeatedRequest(url, options)) return null;
        const fetchUrl = generateUrl(url, options);
        const fetchOptions = generateOptions(options);
        return fetch(fetchUrl, fetchOptions)
            .then(checkStatus)
            .then(parseJSON)
            .then(data => {
                if (options['showMsg'] !== false && SHOW_MSG_METHOD[options.method]) {
                    message.success(getMessage(options.method), 2);
                }
                return data;
            })
            .catch(() => {
                return null;
            });
    }
    
    function handleTableParams(options) {
        const params = (options.params = options.params || {});
        if (params.pagination) {
            params.current = options.pagination.current;
            params.pageSize = options.pagination.pageSize;
            delete params.pagination;
        }
        const filters = params.filters;
        if (filters) {
            Object.assign(params, filters);
            delete params.filters;
        }
        if (params.sorter) {
            const field = params.sorter.field,
                order = params.sorter.order;
            if (field && order) params[order] = field;
            delete params.sorter;
        }
        return options;
    }
    
    function isRepeatedRequest(url, options) {
        let record = REQUEST_RECORD[url],
            now = new Date().getTime();
    
        if (record && _.isEqual(record.options, options) && now - record.lastTime < DEFAULT_REQUEST_INTERVAL) return false;
        REQUEST_RECORD[url] = {
            options: _.assign({}, options),
            lastTime: now,
        };
        return true;
    }
    
    function generateUrl(url, options) {
        const params = options.params;
        if (typeof params === 'object') {
            let paramArray = [];
            Object.keys(params).forEach(key => {
                if (paramArray.length === 0) {
                    paramArray.push('?');
                } else {
                    paramArray.push('&');
                }
                paramArray.push(key);
                paramArray.push('=');
                paramArray.push(params[key]);
            });
            if (paramArray.length !== 0) {
                return url + paramArray.join('');
            }
        }
        return url;
    }
    
    function generateOptions(options) {
        const fetchOptions = _.assign({}, DEFAULT_FETCH_OPTIONS),
            method = options.method,
            data = options.body;
        options.method = options.method ? options.method.toUpperCase() : 'GET';
        if (method) fetchOptions.method = method;
        if (data && Object.prototype.toString.call(data) === '[object Object]') {
            fetchOptions.body = JSON.stringify(data);
            fetchOptions.headers['Content-Type'] = 'application/json';
        }
        const token = cookieUtil.getCookie('token');
        if (token) fetchOptions.headers.Authorization = token;
        return fetchOptions;
    }
    
    function checkStatus(response) {
        if (response.status >= 200 && response.status < 300) {
            return response;
        } else {
            var error = new Error(response.statusText);
            response.json().then(data => {
                message.error(data.message || data, 2);
                console.error(data);
            });
            throw error;
        }
    }
    
    function parseJSON(response) {
        return response.json();
    }
    
    function getMessage(method) {
        let sub = '';
        switch (method) {
            case 'POST':
                sub = '新增成功';
                break;
            case 'PUT':
                sub = '修改成功';
                break;
            case 'DELETE':
                sub = '删除成功';
                break;
            default:
                break;
        }
        return sub;
    }
  • 相关阅读:
    【Vijos1067】守望者的烦恼【矩阵乘法】
    【Vijos1067】守望者的烦恼【矩阵乘法】
    【洛谷P3514】LIZ-Lollipop【思维】【模拟】
    【洛谷P3514】LIZ-Lollipop【思维】【模拟】
    【CF617E】XOR and Favorite Number【莫队】
    【CF617E】XOR and Favorite Number【莫队】
    【牛客练习赛46-A】华华教奕奕写几何【二分】
    【牛客练习赛46-A】华华教奕奕写几何【二分】
    【洛谷P1494】【BZOJ2038】小Z的袜子【莫队】
    【洛谷P1494】【BZOJ2038】小Z的袜子【莫队】
  • 原文地址:https://www.cnblogs.com/zengyuanjun/p/14472364.html
Copyright © 2011-2022 走看看