美文网首页
看到个大牛写的jsonp封装,写的真好,抄一下

看到个大牛写的jsonp封装,写的真好,抄一下

作者: 带带带前端 | 来源:发表于2019-01-23 15:00 被阅读0次

    客户端

    /**
     * JSONP请求工具
     * @param url 请求的地址
     * @param data 请求的参数
     * @returns {Promise<any>}
     */
    const request = ({url, data}) => {
      return new Promise((resolve, reject) => {
        // 处理传参成xx=yy&aa=bb的形式
        const handleData = (data) => {
          const keys = Object.keys(data)
          const keysLen = keys.length
          return keys.reduce((pre, cur, index) => {
            const value = data[cur]
            const flag = index !== keysLen - 1 ? '&' : ''
            return `${pre}${cur}=${value}${flag}`
          }, '')
        }
        // 动态创建script标签
        const script = document.createElement('script')
        // 接口返回的数据获取
        window.jsonpCb = (res) => {
          document.body.removeChild(script)
          delete window.jsonpCb
          resolve(res)
        }
        script.src = `${url}?${handleData(data)}&cb=jsonpCb`
        document.body.appendChild(script)
      })
    }
    // 使用方式
    request({
      url: 'http://localhost:9871/api/jsonp',
      data: {
        // 传参
        msg: 'helloJsonp'
      }
    }).then(res => {
      console.log(res)
    })
    

    服务端

    const {successBody} = require('../utli')
    class CrossDomain {
      static async jsonp (ctx) {
        // 前端传过来的参数
        const query = ctx.request.query
        // 设置一个cookies
        ctx.cookies.set('tokenId', '1')
        // query.cb是前后端约定的方法名字,其实就是后端返回一个直接执行的方法给前端,由于前端是用script标签发起的请求,所以返回了这个方法后相当于立马执行,并且把要返回的数据放在方法的参数里。
        ctx.body = `${query.cb}(${JSON.stringify(successBody({msg: query.msg}, 'success'))})`
      }
    }
    module.exports = CrossDomain
    

    相关文章

      网友评论

          本文标题:看到个大牛写的jsonp封装,写的真好,抄一下

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