jsonp由来:
浏览器为了保证安全,在访问不同源(协议,域名,端口号有一个不一样都叫不同源)的资源时,浏览器会拦截。
为了绕开浏览器的跨域拦截,就有了jsonp跨域方案
jsonp原理:
js中利用标签(例如 script、img等)的src能加载不同源的资源,从而实现跨域。
eg: 利用script加载一个不同源的文件,该文件返回一个函数名,如果返回的函数名在js文件中正好有这个函数,那返回的函数名就调用js文件中的方法,从而达到交流的目的 。
利用这个原理我们用promise来实现一个jsonp公共方法
function jsonP(url, data) {
return new Promise((reslove, reject) => {
// 判断url中是否有带参数,有的话拼接&符,没有的话拼接?号;方便下次拼接参数
const dataString = url.indexOf('?') === -1 ? '?' : '&';
// 利用时间戳声明一个唯一的变量
const callBack = `CB${new Date().getTime()}`;
// 将变量名拼接在链接上
url += `${dataString}callBack=${callBack}`;
if (data) {
// 如果有参数将参数拼接到URL上
Object.keys(data).forEach((item) => {