我想在循环中使用 await 来修改函数,但发现由于我在 foreach 循环中进行的调用是异步的,它无法按预期工作,我的表最终为空。所以我认为好的选择是使用 map 代替,但我无法使其按预期工作:
optionsRaw.forEach(async raw => {
const option = new Option();
option.id = raw['id'];
option.nbMax = raw['nb_max'];
option.disabled = (await this.countAnswer(option.id))>=option.nbMax;
options.push(option);
});
return options;
当我有这个等待时选项是空的 我可以添加一个"然后"或其他东西吗?
否则,我可以这样做吗:
options = options.map(async option=>{
option.disabled = option.nbMax>0 && (await this.countAnswer(option.id, id_challenge))>=option.nbMax;
return option;
})
return options;
"类型承诺不可分配给类型 Option[]">
但是暂时没有成功,我想我肯定错过了这张"地图"的一些东西
您需要使用Promise.all
,它返回一个新的承诺,该承诺通过一系列履行值来实现传递的承诺或拒绝,原因是第一个传递的承诺被拒绝。 我们可以在这里看到 MDN 文档。
所以,用 Promise.all 包装你的代码,就像这样,
options = Promise.all(options.map(async option=>{
option.disabled = option.nbMax>0 && (await this.countAnswer(option.id, id_challenge))>=option.nbMax;
return option;
}));
return options;