zoukankan      html  css  js  c++  java
  • 封装一个简单的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)
    })
  • 相关阅读:
    idea快捷的输出常用语句
    OneinStack基础搭建typecheo轻量级博客
    自动化框架介绍及使用
    jenkins配置自动化
    selenium模拟鼠标点击
    Linux下安装nginx
    解决“chrome正受到自动测试软件的控制”信息栏显示问题
    Git 常用操作
    ZendStudio自定义代码补全,自定义代码段
    07-python之装饰器
  • 原文地址:https://www.cnblogs.com/art-poet/p/12519165.html
Copyright © 2011-2022 走看看