JS实现jsonp

jsonp原理是通过script标签从服务端加载一段js代码,这段js代码执行挂载在window对象上的全局函数window[callbackName]

function jsonp(url, data, callbackName) {
    // 如果没有传callbackName,就随机生成一个
    callbackName = callbackName || 'jsonp' + Math.random().toString().substr(2, 6)
    return new Promise((resolve, reject) => {
        // 1.创建script标签
        let script = document.createElement('script')

        // 2.拼接get请求的url
        let paramsArr = []
        data = data || {}
        for (let key in data) {
            paramsArr.push(`${key}=${data[key]}`)
        }
        paramsArr.push(`callback=${callbackName}`)
        script.src = `${url}?${paramsArr.join('&')}`

        // 3.挂载全局函数
        window[callbackName] = function (callbackData) {
            resolve(callbackData)
            // 删除script节点
            document.body.removeChild(script)
        }

        // 4.发送jsonp请求
        document.body.appendChild(script)

        script.onerror = function (err) {
            reject(err)
        }
    })
}

// 服务端返回 `callbackName([1,2,3])` 这样的js代码即可
// res.send(`${callback}(${JSON.stringify(data)})`)