如何为iTunes搜索提供回调函数API
How to provide callback function to iTunes search API
我正在努力寻找一种方法来提供回调函数以正确使用 iTunes Store search API。
我正在尝试实现此行为:
const getiTunes = fetch(`https://itunes.apple.com/search?term=${search}&media=movie&limit=200`)
.then(results => results.json())
.then(results => {
if (results.errorMessage) throw Error(results.errorMessage)
else setResults(results)
})
.catch(error => {
//handle error
})
到目前为止我有这个:
const getiTunes = results => {
if (results.errorMessage) throw Error(results.errorMessage)
else setITunes(results)
}
const script = document.createElement("script")
script.src = `https://itunes.apple.com/search?term=${search}&media=movie&limit=200&callback=getiTunes`
script.async = true
document.body.appendChild(script)
我不断收到以下错误:
Uncaught ReferenceError: getiTunes is not defined
我也试过&callback="getiTunes"
和&callback=${getiTunes}
,但都失败了。
这些函数在 React 中的 useEffect
挂钩中被调用。有没有特定的方法我必须检索函数名称?
一边
而且如果我尝试不提供回调函数,则只有在搜索是新搜索(即我之前没有搜索过该词条)时它才会起作用。但是,如果我有(比如生产 URL 或本地),那么它会出现以下错误:
Access to fetch at 'https://itunes.apple.com/search?term=spiderman&media=movie&limit=200' from origin 'http://localhost:3000' has been blocked by CORS policy: The 'Access-Control-Allow-Origin' header has a value "--it has the last URL I used to search for this successfully--"...
您尝试的方法是 JSONP (JSON with Padding)
方法。我们只需要外部脚本和函数。
外部网站为您的方法提供了回调函数。
所以它发送函数参数中的所有数据。
你误将 }
添加到你的脚本 url
script.src = `https://itunes.apple.com/search?term=${search}&media=movie&limit=200&callback=getiTunes}`
例如代码:
const getiTunes=results=>{
if (results.errorMessage) throw new
Error(results.errorMessage)
else setITunes(results)
};
const script = document.createElement("script")
script.src = `https://itunes.apple.com/search?term=bat&media=movie&limit=200&callback=getiTunes`
script.async = true
document.body.appendChild(script);
// returns getiTunes(...someData)
我能够通过添加我的脚本来处理对文档的响应来实现这一点。
const loadItunes = document.createElement("script")
loadItunes.src = `https://itunes.apple.com/search?term=${search}&media=movie&limit=200&callback=getiTunes`
loadItunes.async = true
const handleResults = document.createElement("script")
handleResults.type = "text/javascript"
handleResults.text = "function getiTunes(response) { //function code };"
document.body.appendChild(loadItunes)
document.body.appendChild(handleResults)
更新答案
我通过 this code sandbox 找到了更好的解决方案。它通过创建一个函数,然后将响应传递给回调函数,完美地解决了这个问题。
export const fetchJSONP = (url, callback) => {
var callbackName = "jsonp_callback_" + Math.round(100000 * Math.random())
window[callbackName] = function (data) {
delete window[callbackName]
document.body.removeChild(script)
callback(data)
}
var script = document.createElement("script")
script.src = url + (url.indexOf("?") >= 0 ? "&" : "?") + "callback=" + callbackName
document.body.appendChild(script)
}
然后我按以下方式使用它:
const handleResponse = response => {
//do stuff with response
}
fetchJSONP("https://itunes.apple.com/search?term=spiderman&media=movie&limit=200", handleResponse)
我正在努力寻找一种方法来提供回调函数以正确使用 iTunes Store search API。
我正在尝试实现此行为:
const getiTunes = fetch(`https://itunes.apple.com/search?term=${search}&media=movie&limit=200`)
.then(results => results.json())
.then(results => {
if (results.errorMessage) throw Error(results.errorMessage)
else setResults(results)
})
.catch(error => {
//handle error
})
到目前为止我有这个:
const getiTunes = results => {
if (results.errorMessage) throw Error(results.errorMessage)
else setITunes(results)
}
const script = document.createElement("script")
script.src = `https://itunes.apple.com/search?term=${search}&media=movie&limit=200&callback=getiTunes`
script.async = true
document.body.appendChild(script)
我不断收到以下错误:
Uncaught ReferenceError: getiTunes is not defined
我也试过&callback="getiTunes"
和&callback=${getiTunes}
,但都失败了。
这些函数在 React 中的 useEffect
挂钩中被调用。有没有特定的方法我必须检索函数名称?
一边
而且如果我尝试不提供回调函数,则只有在搜索是新搜索(即我之前没有搜索过该词条)时它才会起作用。但是,如果我有(比如生产 URL 或本地),那么它会出现以下错误:
Access to fetch at 'https://itunes.apple.com/search?term=spiderman&media=movie&limit=200' from origin 'http://localhost:3000' has been blocked by CORS policy: The 'Access-Control-Allow-Origin' header has a value "--it has the last URL I used to search for this successfully--"...
您尝试的方法是 JSONP (JSON with Padding)
方法。我们只需要外部脚本和函数。
外部网站为您的方法提供了回调函数。
所以它发送函数参数中的所有数据。
你误将 }
添加到你的脚本 url
script.src = `https://itunes.apple.com/search?term=${search}&media=movie&limit=200&callback=getiTunes}`
例如代码:
const getiTunes=results=>{
if (results.errorMessage) throw new
Error(results.errorMessage)
else setITunes(results)
};
const script = document.createElement("script")
script.src = `https://itunes.apple.com/search?term=bat&media=movie&limit=200&callback=getiTunes`
script.async = true
document.body.appendChild(script);
// returns getiTunes(...someData)
我能够通过添加我的脚本来处理对文档的响应来实现这一点。
const loadItunes = document.createElement("script")
loadItunes.src = `https://itunes.apple.com/search?term=${search}&media=movie&limit=200&callback=getiTunes`
loadItunes.async = true
const handleResults = document.createElement("script")
handleResults.type = "text/javascript"
handleResults.text = "function getiTunes(response) { //function code };"
document.body.appendChild(loadItunes)
document.body.appendChild(handleResults)
更新答案
我通过 this code sandbox 找到了更好的解决方案。它通过创建一个函数,然后将响应传递给回调函数,完美地解决了这个问题。
export const fetchJSONP = (url, callback) => {
var callbackName = "jsonp_callback_" + Math.round(100000 * Math.random())
window[callbackName] = function (data) {
delete window[callbackName]
document.body.removeChild(script)
callback(data)
}
var script = document.createElement("script")
script.src = url + (url.indexOf("?") >= 0 ? "&" : "?") + "callback=" + callbackName
document.body.appendChild(script)
}
然后我按以下方式使用它:
const handleResponse = response => {
//do stuff with response
}
fetchJSONP("https://itunes.apple.com/search?term=spiderman&media=movie&limit=200", handleResponse)