美文网首页
ES6 promise版的Jsonp封装

ES6 promise版的Jsonp封装

作者: 梦想成真213 | 来源:发表于2019-04-11 15:18 被阅读0次

前面一篇整理PromiseAjax的封装,这次做一个JSONP的封装,现在前端工程化的普及,基本上都是前后端分离,会有跨域的问题,JSONP是一种解决方案,不过JSONP只能处理get类型的请求。它的原理就是通过动态加载一个script文件,文件内容是一个回调函数参数就是接口返回的数据,执行这个回调函数就能拿到数据。
代码如下:

//Jsonp.js
(function(){
    //document.getElementsByTagName 返回一个HTMLCollection[head] [0]取得head元素
    //html5 新增head属性 document.head引用文档的<head>元素
    const head = document.head ? document.head : document.getElementsByTagName('head')[0]
    let id = new Date();
    const JsonpRequest = (options) => {
        return new Promise((resolve,reject) => {
            const script = document.createElement('script');
            let responseData;
            let callbackName = 'myJsonp' + (id++);
            const removeScript = (e) => {
                if(script.onload) script.onload = null;
                if(script.onerror) script.onerror = null;
                if(responseData){
                    resolve(responseData);
                } else{
                    reject(new Error('fail'));
                }
            }
            script.type = 'text/javascript';
            if(script.onload){
                script.onload = removeScript;
            }
            window[callbackName] = () => {
                responseData = arguments;
            }
            script.src = options.url + urlParams(options.params) + '&cb' + callbackName;
            head.appendChild(script);
        });
        
        window.JsonpRequest = window.JsonpRequest || JsonpRequest;       
    }
    const urlParams = (params) => {
        const result = [];
        for(let prop in params){
            result.push(`prop=${params[prop]}`);
        }
        return result.join('&');
    }
})();

调用

<script src="Jsonp.js"></script>
<script>
  JsonpRequest({
      url:'localhost:8080',
      params:{
         id:123,
         page:10
      } 
  })
.then((data) => {
  console.log(data)
},(e) => {
  console.log(e)
});
</script>

相关文章

网友评论

      本文标题:ES6 promise版的Jsonp封装

      本文链接:https://www.haomeiwen.com/subject/sxmgbqtx.html