getScript在前端中请求js文件和jsonp

栏目: Json · 发布时间: 6年前

导语: getScript在前端中使用的非常广泛,那么这里也分享下自己使用的ts版本的getScript,可以用来请求js文件和进行jsonp的请求

getScript在前端中使用的非常广泛,那么这里也分享下自己使用的ts版本的getScript:

/**
 * 加载js文件
 * @param {string} url 要加载的js文件链接
 * @param {function} callback 回调函数
 * @returns {Promise} 返回一个Promise对象,若加载失败或者超时,则reject
 */
const getScript = (url: string, callback: ()=>{}): Promise<null> => {
    const head = document.getElementsByTagName('head')[0];
    const script = document.createElement('script');
    const timeout: number = 5000; // 过期时间
    let timer: number;

    script.setAttribute('type', 'text/javascript');
    script.setAttribute('charset', 'UTF-8');
    script.setAttribute('src', url);
    if (sid) {
        script.setAttribute('id', sid);
    }

    const cleanup = () => {
        if (script.parentNode) {
            script.parentNode.removeChild(script);
        }
        if (timer) {
            clearTimeout(timer);
        }
    };
    head.appendChild(script);

    return new Promise((resolve, reject) => {
        // 执行回调
        const callbackFn = () => {
            if (timer) {
                clearTimeout(timer);
            }
            callback();
            resolve();
        };

        script.onload = () => {
            callbackFn();
        };

        if (timeout) {
            timer = setTimeout(() => {
                cleanup();
                reject(new Error(`get ${url} timeout`));
            }, timeout);
        }
    });
};

正常请求一个js文件,然后设置了一个5000ms的过期时间,若请求资源不成功,则进入到 reject 中。同时,getScript支持使用callback和Promise两种方式执行结果的回调,不过callback的方式无法获取到超时的情况:

getScript('http://mat1.gtimg.com/libs/jquery2/2.2.0/jquery.min.js').then((jQuery: any)=>{
    console.log(jQuery.fn.jquery);
}).catch(e=>console.error('请求超时'));

这种方式,其实稍微改造一下,也是可以直接用来跨域,请求支持jsonp接口的。在url的后面添加上callback的请求参数,然后在回调里执行这个callback。 例如:

const getScript = (url: string, data: {}): Promise<any> => {
    const head = document.getElementsByTagName('head')[0];
    const script = document.createElement('script');
    const timeout: number = 5000; // 过期时间
    let timer: number;
    let fecthCallBack: string = 'cb' + Date.now() + '_' + ('' + Math.random()).substr(-8);

    const cleanup = () => {
        if (script.parentNode) {
            script.parentNode.removeChild(script);
        }
        window[fecthCallBack] = () => {};
        delete window[fecthCallBack];
        if (timer) {
            clearTimeout(timer);
        }
    };
    head.appendChild(script);

    // 将Object类型的数据转换为URL链接需要的参数
    let paramObj = (params: any) => {
        let str = '',
            key,
            item;
        for (key in params) {
            if (typeof params[key] === 'object') {
                item = JSON.stringify(params[key]);
            } else {
                item = params[key];
            }
            str += `&${key}=${encodeURIComponent(item)}`;
        }
        return str.substring(1);
    };

    url += (~url.indexOf('?') ? '&' : '?') + paramObj(data) + '&callback=' + fecthCallBack;

    script.setAttribute('type', 'text/javascript');
    script.setAttribute('charset', 'UTF-8');
    script.setAttribute('src', url);

    return new Promise((resolve, reject) => {
        window[fecthCallBack] = (data: any) => {
            cleanup();
            resolve(data);
        };

        if (timeout) {
            timer = setTimeout(() => {
                cleanup();
                reject(new Error('Timeout'));
            }, timeout);
        }
    });
};

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

深入解析Spring MVC与Web Flow

深入解析Spring MVC与Web Flow

Seth Ladd、Darren Davison、Steven Devijver、Colin Yates / 徐哲、沈艳 / 人民邮电出版社 / 2008-11 / 49.00元

《深入解析Spring MVCgn Web Flow》是Spring MVC 和Web Flow 两个框架的权威指南,书中包括的技巧和提示可以让你从这个灵活的框架中汲取尽可能多的信息。书中包含了一些开发良好设计和解耦的Web 应用程序的最佳实践,介绍了Spring 框架中的Spring MVC 和Spring Web Flow,以及着重介绍利用Spring 框架和Spring MVC 编写Web ......一起来看看 《深入解析Spring MVC与Web Flow》 这本书的介绍吧!

MD5 加密
MD5 加密

MD5 加密工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具