javascript - 在执行下一行之前等待 foreach 完成
问题描述
我希望代码等待 foreach 函数完成,然后再转到下一行对计数器编号执行 if 语句。我确定我必须在某个地方放一个 Promise ......但我也认为 .then() 会成功吗?
似乎有这样的例子,但我无法弄清楚这个或我在这里出错的地方:
async getSomeData () {
const data = [];
const ref = fire.firestore();
ref
.collection(‘foo’)
.where(‘open’, '==', true)
.get()
.then(async snapshot => {
let count = 0;
snapshot
.docs
.forEach(async doc => {
const {foo, bar} = doc.data();
const number_count = await this.getNumber(doc.id);
if (number_count >= 1){
count++;
data.push({
foo,
bar
});
this.setState({
data : data,
});
}
})
.then() ?????
**//THIS IS EXECUTING BEFORE THE FOREACH FINISHES**
if(count==0){
this.setState({
isLoading: false,
noStores: true
});
}
}).catch(error => {
console.log(error);
//if fails
this.setState({
noStores : true,
});
});
};
感谢我能得到的任何帮助。谢谢!
解决方案
javascript 代码,默认情况下将在移动到下一行之前完成。这是它的自然行为。如果您只是正常编写代码,它将一次执行一行。
您已在代码中添加了“异步”标签,然后要求它不要以异步方式运行,这完全合乎逻辑。
如果您希望代码以完成 foreach 的方式执行,只需不要添加任何异步标签。
推荐阅读
- azure - Azure PullAudioInputStream 无法与 Twilio Voice 一起正常工作
- flutter - 颤振中的计步器包不适用于某些设备
- .net - 找出依赖项 / dll 的来源
- python - Plotly:如何在一个 plotly 图表中从同一个 pandas 数据框的不同列中绘制多条线?
- mysql - 当部分行在 MySQL 中是唯一的时,如何删除重复的行?
- c++ - C++,创建具有可选值的结构
- javascript - 调用 setState 后 React 没有重新渲染,为什么?
- unity3d - Unity 2020 项目构建 asm.js 文件而不是 wasm
- python - 如何使用 Pandas 中的模块 melt 有效地熔化多个列?
- ruby - 在define_method中动态设置参数