[TOC]

首先推销一下自己封装的包:simple-promisify-jsonp ,npm i simple-promisify-jsonp 就够了

如何使用

  • 这段代码实现了promise的jsonp请求。
  • 使用方法:

    // link String,支持jsonp的get请求链接
    // params Object,除了callback之外的参数
    this.$setJsonp(link, params)
      .then(res => {
          // success
      })
      .catch(err => {
          // fail
      })
    
  • 声明,放在插件的js文件里

    Vue.prototype.$setJsonp = function (url, params = null) {
      return new Promise((resolve, reject) => {
          let randomStr = (function () {
              return (Math.floor(Math.random() * 100000) * Date.now()).toString(16)
          })()
          let sc = document.createElement('script')
          let paramsStr = ''
          if (params) {
              Object.keys(params).forEach(key => {
                  paramsStr += `&${key}=${params[key]}`
              })
          }
          sc.setAttribute('src', `${url}?callback=jsonp${randomStr}${paramsStr}`)
          sc.setAttribute('name', `jsonp${randomStr}`)
          sc.addEventListener('error', onError)
          document.querySelector('body').appendChild(sc)
          window[`jsonp${randomStr}`] = function (res) {
              resolve(res)
              delete window[`jsonp${randomStr}`]
              sc.removeEventListener('error', onError)
              document.querySelector('body').removeChild(document.querySelector(`script[name=jsonp${randomStr}]`))
          }
          function onError (err) {
              reject(err)
          }
      })
    }
    

什么是JSONP?

利用