Итак, в основном я создал цикл, который принимает значения из массива и помещает эти значения в цикл, используя API-интерфейс youtube. Ссылка на youtube работает нормально, если я обращаюсь к ней из цикла, но вне цикла '(когда я запускаю console.info ({urllist})', я получаю пустой массив. Я хочу вставить все значения в пустой массив urllist, затем перенесите их в переменную состояния ('videos')
Я имею в виду функцию videoUrls
class MusicCharter extends React.Component{
constructor(){
super();
this.state= {
data:[],
videos:[],
}
}
componentDidMount(){
XHR.onreadystatechange = function(){
if (XHR.readyState === 4 && XHR.status === 200) {
var url = XHR.responseText;
this.setState({data:(JSON.parse(url).tracks.track)})
}
}.bind(this)
XHR.open("GET","http://ws.audioscrobbler.com/2.0/?method=chart.gettoptracks&api_key=xxxxxxx&format=json");
XHR.send();
}
videoUrls=()=>{
let i=0;
let urllist=[]
for(i;i< this.state.data.length;i++){
fetch(`https://www.googleapis.com/youtube/v3/search?part=snippet&q=${this.state.data[i].name}&key=xxxxxxxxxxx0`)
.then(response=> {
return response.json()
})
.then(data=>{
return(urllist.push(data.items[0]))})
}
console.info({urllist})
}


![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Ваш цикл for не выполняет итерацию асинхронно, но вы можете обойти это, поместив цикл for внутри функции Асинхронный процесс внутри цикла JavaScript forasync и awaiting в результате асинхронных операций.
videoUrls = async () => {
let i=0;
let urllist=[]
for(i;i< this.state.data.length;i++){
const response = await fetch(`https://www.googleapis.com/youtube/v3/search?part=snippet&q=${this.state.data[i].name}&key=xxxxxxxxxxx0`)
const json = await response.json()
urllist.push(json.items[0])
console.info({urllist})
}
}
Это предотвращает увеличение цикла for до тех пор, пока не будут завершены выборка и преобразование ответа в json.
Можно использовать Promise.all
videoUrls = () =>{
const promises = this.state.data.map(item => {
return fetch(`https://www.googleapis.com/youtube/v3/search?part=snippet&q=${this.state.data[i].name}&key=xxxxxxxxxxx0`)
.then(response=> {
return response.json()
});
});
Promise.all(promises).then(results => {
const videos = results.map(result => result.items[0]);
console.info(videos);
this.setState({videos});
})
}
Я немного изменил, но спасибо, лол. я не думал использовать это