我具有以下三个功能:
async doAction (link, state)
{
try {
let response = await fetch(
'http://xxx.tld/'+link,
{
method: 'POST',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json',
},
body: JSON.stringify({
type:1
})
}, {timeout: 500});
let responseJson = await response.json();
alert(state)
switch (state) {
//somethings
.
.
.
default:
}
} catch (error) {
//alert(error);
}
}
async componentDidMount(){
this.doAction('loadModAdv.php', 1)
}
async loadModAdv(object){
object.map(async (data)=>{
if(data.status == "1")
{
await this.doAction(data.fileName, parseInt(data.moduleAdvertise, 10) + 1)
}
})
}
在地图中执行“ await this.doAction”时,“ alert(state)”不会按顺序返回数据。
有时是1 2 4,有时是1 4 2
解决方案是什么?
答案 0 :(得分:1)
要在数组上实现一致/确定性的异步迭代,请考虑使用以下模式更新代码:
async loadModAdv(object){
for(const data of object) {
if(data.status == "1") {
await this.doAction(data.fileName, parseInt(data.moduleAdvertise, 10) + 1)
}
}
}
作为注释,我注意到您使用了map
函数进行迭代,但是似乎您没有使用地图的结果,因此在此答案中,我选择了一种基于在for
循环上。
如果您想通过这种模式实现“类似于地图的”行为,则可以执行以下操作:
async loadModAdv(object){
var results = []
for(const data of object) {
if(data.status == "1") {
results.push(await this.doAction(data.fileName, parseInt(data.moduleAdvertise, 10) + 1))
}
}
console.log('data in order ', JSON.stringify(results))
}
希望有帮助!