嘿,所有。鏈接獲取承諾(JSON,React,Webpack,NodeJS)
我需要抓取10次,然後返回每個請求的.JSON並將其推入狀態。 大部分抓取工作,但是大約一半的時候會減慢,並在完成之前暫停。 承諾似乎接受'cors'的迴應,而不是實際的json,從而觸發過早。另外,我不喜歡爲了改變偏移量而多次重複相同的代碼,但是我花了幾個小時處理一個for循環,並且我被卡住了,所以如果你們可以推薦更好的方式做到這一點將是真棒。
下面的代碼:
function FetchAll(API_KEY, CX, query, E, that, pushState){
fetch(`https://www.googleapis.com/youtube/v3/channels?part=contentDetails&id=${E.target.value}&key=${API_KEY}`, {
method: 'get',
headers : {
'Content-Type': 'application/json',
'Accept': 'application/json'
}
}).then(function(response){
return response.json()
}).then(function(uploads){
console.log(uploads)
return fetch(`https://www.googleapis.com/youtube/v3/playlistItems?playlistId=${uploads.items[0].contentDetails.relatedPlaylists.uploads}&key=${API_KEY}&part=snippet&maxResults=50`)
}).then(response => {
return response.json()
}).then(function(data){
console.log(data)
that.setState({yt:data})
}).then(function(){
return fetch(`https://www.googleapis.com/customsearch/v1?key=${API_KEY}&num=10&cx=${CX}&q=${query}&start=${1}`)
}).then(function(response){
return response.json();
}).then(r => pushState(r))
.then(function(){
return fetch(`https://www.googleapis.com/customsearch/v1?key=${API_KEY}&num=10&cx=${CX}&q=${query}&start=${11}`)
}).then(function(response){
return response.json();
}).then(r => pushState(r))
.then(function(){
return fetch(`https://www.googleapis.com/customsearch/v1?key=${API_KEY}&num=10&cx=${CX}&q=${query}&start=${21}`)
}).then(function(response){
return response.json();
}).then(r => pushState(r))
.then(function(){
return fetch(`https://www.googleapis.com/customsearch/v1?key=${API_KEY}&num=10&cx=${CX}&q=${query}&start=${31}`)
}).then(function(response){
return response.json();
}).then(r => pushState(r))
.then(function(){
return fetch(`https://www.googleapis.com/customsearch/v1?key=${API_KEY}&num=10&cx=${CX}&q=${query}&start=${41}`)
}).then(function(response){
return response.json();
}).then(r => pushState(r))
.then(function(){
return fetch(`https://www.googleapis.com/customsearch/v1?key=${API_KEY}&num=10&cx=${CX}&q=${query}&start=${51}`)
}).then(function(response){
return response.json();
}).then(r => pushState(r))
.then(function(){
return fetch(`https://www.googleapis.com/customsearch/v1?key=${API_KEY}&num=10&cx=${CX}&q=${query}&start=${61}`)
}).then(function(response){
return response.json();
}).then(r => pushState(r))
.then(function(){
return fetch(`https://www.googleapis.com/customsearch/v1?key=${API_KEY}&num=10&cx=${CX}&q=${query}&start=${71}`)
}).then(function(response){
return response.json();
}).then(r => pushState(r))
.then(function(){
return fetch(`https://www.googleapis.com/customsearch/v1?key=${API_KEY}&num=10&cx=${CX}&q=${query}&start=${81}`)
}).then(function(response){
return response.json();
}).then(r => pushState(r))
.then(function(){
return fetch(`https://www.googleapis.com/customsearch/v1?key=${API_KEY}&num=10&cx=${CX}&q=${query}&start=${91}`)
}).then(function(response){
return response.json();
}).then(r => pushState(r))
.then(function(){
return fetch(`https://www.googleapis.com/customsearch/v1?key=${API_KEY}&num=10&cx=${CX}&q=${query}&start=${101}`)
}).then(function(response){
return response.json();
}).then(r => pushState(r))
}
export default FetchAll
如果你wonering,使用fetchall被稱爲主App.js文件,一切被髮送給它的參數。
這是pushState的(如果需要)
FetchAll(API_KEY, CX, query, e, that,
(r) => {
console.log(r)
let c = that.state.compareRaw
c.push(r)
that.setState({
compareRaw:c
})
}
)
}
'那個' 是參考 '這個'
任何幫助或尖端不勝感激。謝謝!
嘗試使用異步/等待,因爲您標記了reactjs,如果您使用的是redux,我會建議使用'redux-saga'處理副作用的更好方法? –
你能更準確地觀察你正在觀察的症狀嗎? 「提取」的哪部分不起作用?你在工作實例和不工作實例之間有什麼不同? 「中途減速」是什麼意思?中途在哪裏?完成之前它是如何暫停的?是否引發錯誤?請求是否未收到回覆?如果你發現你錯誤地期望某些數據是json,而這些數據實際上是其他的東西,那麼目前是什麼讓你無法解決這個問題呢? – fvgs
如上所述,async/await在這裏描述依賴關係是很好的。但對於不依賴於對方的請求和工作,數組(以及map/forEach/loop)和'Promise.all()'將使您的代碼更加美好。 – fvgs