getJSONP.ts 1002 字节
Newer Older
1
import { isFunction } from '@vue/shared'
Q
qiang 已提交
2 3 4 5
interface Options {
  callback?: string
  timeout?: number
}
Q
qiang 已提交
6
let index = 0
Q
qiang 已提交
7 8 9 10 11 12 13 14
export function getJSONP(
  url: string,
  options: Options,
  success: Function,
  error: Function
) {
  var js = document.createElement('script')
  var callbackKey = options.callback || 'callback'
Q
qiang 已提交
15
  var callbackName = '__uni_jsonp_callback_' + index++
Q
qiang 已提交
16
  var timeout = options.timeout || 30000
fxy060608's avatar
fxy060608 已提交
17
  var timing: ReturnType<typeof setTimeout>
Q
qiang 已提交
18 19
  function end() {
    clearTimeout(timing)
fxy060608's avatar
fxy060608 已提交
20
    delete (window as any)[callbackName]
Q
qiang 已提交
21 22
    js.remove()
  }
fxy060608's avatar
fxy060608 已提交
23
  ;(window as any)[callbackName] = (res: any) => {
24
    if (isFunction(success)) {
Q
qiang 已提交
25 26 27 28 29
      success(res)
    }
    end()
  }
  js.onerror = () => {
30
    if (isFunction(error)) {
Q
qiang 已提交
31 32 33 34 35
      error()
    }
    end()
  }
  timing = setTimeout(function () {
36
    if (isFunction(error)) {
Q
qiang 已提交
37 38 39 40 41 42 43 44
      error()
    }
    end()
  }, timeout)
  js.src =
    url + (url.indexOf('?') >= 0 ? '&' : '?') + callbackKey + '=' + callbackName
  document.body.appendChild(js)
}