在没风的地方找太阳  在你冷的地方做暖阳 人事纷纷  你总太天真  往后的余生  我只要你 往后余生  风雪是你  平淡是你  清贫也是你 荣华是你  心底温柔是你  目光所致  也是你 想带你去看晴空万里  想大声告诉你我为你着迷 往事匆匆  你总会被感动  往后的余生  我只要你 往后余生  冬雪是你  春花是你  夏雨也是你 秋黄是你  四季冷暖是你  目光所致  也是你 往后余生  风雪是你  平淡是你  清贫也是你 荣华是你  心底温柔是你  目光所致  也是你
jQuery火箭图标返回顶部代码 - 站长素材

封装一个简单的JSONP

简单来说通过script标签的src属性,src属性不仅仅可以写 JS文件,可以请求任意文件。jsonp是通过JS这一特点实现,并添加async(异步属性)。

当我们用src请求一下后台文件(例如:php)。

1.如果我们在PHP文件中返回来的是 var data =1一条一句的话,将立即执行,那我们需要创建很多个script,才能完成我们的需求。

2.而且加了async有可能在下面拿不到。

所以一般在后台文件中返回的是函数调用,前台定义一个函数。通过SRC属性地址后?callback=hi. 前端页面就是hi()。并且用函数的形式可以解决异步的问题。

普通请求 通过控制台的 的 xhr 。而JSONP是通过控制台的js请求文件。

注意:动态创建的script都是异步的。

 

下面使用ES6'封装JSONP

export function myJSONP (url,params,callbackName) {
  return new Promise((resolve, reject) => {// 根据url是否带有参数决定参数前缀符
    let paramFlag= url.indexOf('?') === -1 ? '?' : '&'// 组装带回调函数和请求参数的url
    url += `${paramFlag}callback=${callbackName}`
    if (params) {
      for (let i in params) {
        url += `&${i} = ${params[i]}`
      }
    }
    let script = document.createElement('script')// 动态创建script标签 在回调函数中需要对该动态创建的标签进行删除
    script.src = url
    window[callbackName] = (res) => {// jsonp返回数据到回调函数 需要注意 回调函数必须绑定在window上 且接受数据完毕后要进行回调函数的删除
      delete window[callbackName]// 删除绑定在window上的回调函数
      document.body.removeChild(script)// 删除动态创建的script标签
      if (res) {
        resolve(res)
      } else {
        reject('没有返回数据')
      }
    }
    script.addEventListener('error', () => {// 处理动态加载script标签异常的情况
      delete window[callbackName]
      document.body.removeChild(script)
      reject('script资源加载失败')
    }, false)
    dcoument.body.appendChild(script)// 添加js节点到document上,开始请求
  })
}

 

使用

import myJSONP from 'common/myJSON'

const url = '接口地址'
const params = '请求参数 对象'
const callbackName = '回调函数名称'

myJSONP(url, params, callbackName).then(res => {
  console.log(res)
  }).catch(err => {
  console.log(err)
})

 

posted @ 2020-03-18 18:16  艺术诗人  阅读(289)  评论(0编辑  收藏  举报