我正在尝试提出一种方法,以确保在触发另一个功能之前完成某个动作。在我的代码中,我启动了一个API请求以更新数据,然后根据该第一个请求的结果计算其他一些值。
但是,我有时会遇到的问题是,在第二个函数触发之前第一个请求不会完成,因此数据最终会损坏并且不同步。我一直在使用第二个功能的超时来临时处理此问题。但是,我想使用async / await代替,因为显然这是处理此类问题的更好(且有保证)的方法-因为假定超时可能无法正常工作永远都不是一件好事。
这是我目前拥有的:
private async moveRecord(stage) {
if (!this.customer || !this.selectedService) return;
let targetService = this.selectedService.service;
let staffStarted = await this.userAccessService.getTargetId();
this.clientMoveService.moveClientRecord(this.client._id, category, targetService, staffStarted);
setTimeout(() =>
{
this.getNextStageOperation();
}, 1000);
}
如何调整此代码以使用异步/等待仅在第一个请求this.getNextOperation
完成后才触发this.clientMoveService.moveClientRecord()
?
我可以简单地做到这一点吗?
private async moveRecord(stage) {
if (!this.customer || !this.selectedService) return;
let targetService = this.selectedService.service;
let staffStarted = await this.userAccessService.getTargetId();
await this.clientMoveService.moveClientRecord(this.client._id, category, targetService, staffStarted);
this.getNextStageOperation();
}
为进一步清楚起见,moveClientRecord()
是一个通过套接字发出的请求,如下所示:
public moveClientRecord(clientId: string, category: string, service: string, staffStarted: string)
{
let args = { id: clientId, category: category, service: service, staff: staffStarted };
console.log('args: ', args);
API.service.cast({
eventName: `clients.updateStatus`,
args: args,
listener: function (data)
{
// Ignore if socket disconnects
if (data === 'disconnect' || data === 'error') return;
// Return true to stop event listener
return true;
}.bind(this)
});
}
答案 0 :(得分:1)
它将以这种方式工作:
private async moveRecord(stage) {
if (!this.customer || !this.selectedService) return;
let targetService = this.selectedService.service;
let staffStarted = await this.userAccessService.getTargetId();
// must return a Promise
await this.clientMoveService.moveClientRecord(this.client._id,
category, targetService, staffStarted);
this.getNextStageOperation();
}
答案 1 :(得分:0)
如果this.clientMoveService.moveClientRecord返回一个承诺,您就可以这样做
await this.clientMoveService.moveClientRecord(this.client._id, category, targetService, staffStarted);