导语: 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);
}
});
};
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 如何向前端推送用户请求的信息?
- 前端跨域请求解决方案汇总
- 关于前端ajax请求的优雅方案(http客户端为axios)
- Spring Boot + Vue 前后端分离开发,前端网络请求封装与配置
- 用pymysql和Flask搭建后端,响应前端POST和GET请求
- 前端必知必会HTTP请求系列(三)HTTP报文内的http信息
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
社交电商
[美] Stephan Spencer(斯蒂芬.斯宾塞)、[美] Jimmy Harding(吉米.哈丁)、[美] Jennifer Sheahan(詹尼弗.希汉) / 谭磊 / 电子工业出版社 / 2015-3 / 69.00元
你想要在互联网上赚钱吗?想要做好电子商务吗?那么你一定不能忽视社交媒体的力量。不管你想要营销的是实物商品、电子类产品还是本地的服务,这本书会教你怎么做。 《社交电商》全面介绍形形色色的社交媒体以及如何利用这些社交媒体来为你的企业做好服务。如果你经营得不好,在社交媒体上散发出的只是噪声而不是真正的信息。 而如果做得好,社交媒体会成为你最有效的营销工具,帮助你赢得老客户的拥戴,获得新的客户。 ......一起来看看 《社交电商》 这本书的介绍吧!