我的问题是,我的最终回报是在所有操作结束之前立即得到打印。如果为this.state
,则会打印一个空数组,因为它会立即打印。如果我返回pop
,它将在数据加载之前立即打印。
这很烦人,因为我从一开始就在唯一的功能中等待着。我完全不知道我的代码是怎么回事。基本上,让我填补您的空白。 getStuff()给了我一个ID数组。那很好。这就是asyncForEach
的
async function asyncForEach(array, callback) {
for (let index = 0; index < array.length; index++) {
await callback(array[index], index, array);
}
它基本上异步地运行foreachloop,因为我获取数据并且想要等待每个返回。 fetch
会为我获取一些隐藏在data.appnews.newsitems
中的文章,对于每篇文章,我都希望将其置于我的状态,并按时间顺序对其进行排序。所有这些作品。在我的渲染中,它将所有内容一一打印,然后慢慢看到每一篇文章都一一载入。这一切都应该做。但是,它一加载就立即返回我的return语句。我在底部的不同时间使用了promise.all和一个异步函数,它们都在我的所有文章加载之前执行。在promise.all
中,由于我的状态为空,它返回一个空数组,然后在控制台help
中看到,然后我看到文章从加载到屏幕的状态出现。有人可以向我慢慢解释我的代码发生了什么吗?我真的以为await getstuff().then...
会暂停所有内容,等待其中的所有内容完成,然后返回this.state
const getNews = async () => {
await getstuff().then(result => {
asyncForEach(result, async gameID => { //fetch data for gameID that I have
await fetch(`https://ancient-dusk-43980.herokuapp.com/${gameID}/news`)
.then(res => res.json())
.then(data => {
data.appnews.newsitems.forEach(article => { //push each article to the state
this.setState({
articles: [...this.state.articles, article]
});
this.state.articles = this.state.articles.sort(function(a, b) {
return b.date - a.date;// sort each article by date
});
});
})
});
})
return this.state; //this is getting printed instantly. I see an empty array in console
};
Promise.all([getNews()]) //ran this at seperate times then my "init"
.then(val => { // both are used to
console.log(val)//
})
async function init () {
await getNews()
console.log('help')
}
init()
理想情况下,在我的console.log('help') or my
console.log(val)I want to replace those with more code because I want to make a few more changes to
this.state中,但我不能这样做,因为this.state始终为空,因为getNews似乎立即返回它具有的任何值。感谢您阅读这则长消息,你们真棒。