用promise封装调用jsonp效果,可以按效果自己再封装一遍
import CryptoJS from 'crypto-js' //注册crypto-js,看你自己怎么调用了
getWeather() {
const jsonp = function(url, callbackFunctionName = 'callbackFunctionName') {
return new Promise((resolve, reject) => {
// 定义回调函数
window[callbackFunctionName] = (response) => {
// 处理响应数据
resolve(response)
// 清理:删除 script 标签和全局的回调函数
document.body.removeChild(script)
delete window[callbackFunctionName]
}
// 创建 script 标签
const script = document.createElement('script')
script.src = `${url}&callback=${callbackFunctionName}`
script.onerror = () => reject('JSONP 请求失败')
// 将 script 标签添加到文档中,通常添加到 body 而不是 head
document.body.appendChild(script)
})
}
const getUrl = function() {
const time = Math.round(new Date().getTime() / 1000)
const str = 'ts=' + time + '&ttl=30&uid=***' // 公钥
const hash = CryptoJS.HmacSHA1(str, '***') // 私钥
const base = hash.toString(CryptoJS.enc.Base64)
const sig = encodeURIComponent(base)
const url = 'https://api.seniverse.com/v3/weather/now.json?location=beijing&' + str + '&sig=' + sig // location 区域/也可以用ip
return url
}
const url = getUrl()
return jsonp(url)
}
最后调用
this.getWeather().then(res => {
console.log(res)
})