承诺所有人进行四次 api 调用而不是两次 api 调用
Promise all making four api calls instead of two api calls
我使用 Promise.all
和 toPromise()
进行了两次 api 调用,如下所示:
Promise.all(this.hostName.slice(0, this.Id.length).map((hostName) => {
return this.serviceC.status(hostName)
.then(res => {
const oretry: ORInterface = {
oQid: res.rows[0].qid,
reason: this.reason
};
return this.serviceB.retry(oretry).toPromise();
})
.then(() => {
return Promise.all(this.Id.slice(0, this.Id.length).map(id => {
const sretry: SDInterface = {
hostName,
Id: id,
reason: this.reason
};
this.serviceB.createDbEntry(sentry).toPromise();
}));
});
}))
.then(() => {
this.dialog.close();
})
.catch(err => {
console.log(err);
});
此处this.serviceB.retry(oretry)
被正确执行。
但是,this.serviceB.createDbEntry(sentry)
被执行了两次。
hostName array
有两个值:hostA
和hostB
同样,Id array
有两个值:Id1
和Id2
现在,问题是 this.serviceB.createDbEntry(sentry)
正在创建四个数据库条目,如下所示:
`hostA` `Id1`
`hostA` `Id2`
`hostB` `Id1`
`hostB` `Id2`
它应该只包含两个条目:
`hostA` `Id1`
`hostB` `Id2`
由于您的主机名和 ID 似乎相关,因此您不应该对整个 this.id
切片执行 map
,而只取与当前主机名对应的那个。
所以,得到当前主机名的顺序索引如下:
Promise.all(this.hostName.slice(0, this.Id.length).map((hostName, i) => {
// ^^^^
然后再往下,不做另一个,嵌套Promise.all
,但是:
.then(() => {
let id = this.Id[i];
const sretry: SDInterface = {
hostName,
Id: id,
reason: this.reason
};
return this.serviceB.createDbEntry(sretry).toPromise();
});
此外,修正最后一行 sretry
的拼写(您有 sentry
)
我使用 Promise.all
和 toPromise()
进行了两次 api 调用,如下所示:
Promise.all(this.hostName.slice(0, this.Id.length).map((hostName) => {
return this.serviceC.status(hostName)
.then(res => {
const oretry: ORInterface = {
oQid: res.rows[0].qid,
reason: this.reason
};
return this.serviceB.retry(oretry).toPromise();
})
.then(() => {
return Promise.all(this.Id.slice(0, this.Id.length).map(id => {
const sretry: SDInterface = {
hostName,
Id: id,
reason: this.reason
};
this.serviceB.createDbEntry(sentry).toPromise();
}));
});
}))
.then(() => {
this.dialog.close();
})
.catch(err => {
console.log(err);
});
此处this.serviceB.retry(oretry)
被正确执行。
但是,this.serviceB.createDbEntry(sentry)
被执行了两次。
hostName array
有两个值:hostA
和hostB
同样,Id array
有两个值:Id1
和Id2
现在,问题是 this.serviceB.createDbEntry(sentry)
正在创建四个数据库条目,如下所示:
`hostA` `Id1`
`hostA` `Id2`
`hostB` `Id1`
`hostB` `Id2`
它应该只包含两个条目:
`hostA` `Id1`
`hostB` `Id2`
由于您的主机名和 ID 似乎相关,因此您不应该对整个 this.id
切片执行 map
,而只取与当前主机名对应的那个。
所以,得到当前主机名的顺序索引如下:
Promise.all(this.hostName.slice(0, this.Id.length).map((hostName, i) => {
// ^^^^
然后再往下,不做另一个,嵌套Promise.all
,但是:
.then(() => {
let id = this.Id[i];
const sretry: SDInterface = {
hostName,
Id: id,
reason: this.reason
};
return this.serviceB.createDbEntry(sretry).toPromise();
});
此外,修正最后一行 sretry
的拼写(您有 sentry
)