【发布时间】:2021-10-22 17:44:09
【问题描述】:
我有一个打字稿程序,它在外部服务中调用各种命令。它使用 Promises 来处理成功完成或错误条件。有一个命令序列,例如:
server.doTask1()
.then(server.doTask2())
.then(server.doTask3())
.catch( ... handle the error )
在继续下一个任务之前成功完成每个任务很重要,因此如果有任何失败,它会直接进入 catch() 而不尝试更多任务。
问题的出现是因为其中一个任务本身是异步返回的——一旦任务成功启动,承诺就会实现。我可以调用另一个外部命令来检查进度。我的尝试如下所示:
server.doTask1()
.then(server.doTask2())
.then(server.doTask3())
.then(server.doLongRunningTask())
还有……
doLongRunningTask() {
return new Promise((resolve, reject) => {
this.runCommand('external command')
.then((result) => resolve(this.waitForCommand(result.Id)))
.catch((err) => reject(err));
});
}
private waitForCommand(commandId : string) : Promise<any> {
while (true) {
this.runCommand(`external command status report ${commandId}`)
.then((result) => {
if (result.Status==='IN_PROGRESS') {
console.log(`Status is ${result.Status}, waiting...`);
this.wait(60);
} else {
console.log(`Status complete`);
return Promise.resolve();
}
})
.catch((error) => {
return Promise.reject(error);
})
}
}
public wait(seconds : number) {
var now = new Date().getTime();
while(new Date().getTime() < now + (seconds*1000)){ /* Do nothing */ }
}
目的是让waitForCommand每分钟检查一次状态,并在长时间运行的任务报告完成时履行承诺。但实际发生的情况是,它在每次检查之间都没有等待一分钟,并且出现了许多行“状态为 IN_PROGRESS,正在等待...”,并且进程变得无响应。
为了等待,我尝试了await new Promise(res => setTimeout(res, 60000));,但 Typescript 编译器抱怨“等待表达式只允许在异步函数中和模块的顶层使用”
我怎样才能达到我想要的结果?
【问题讨论】:
-
“在继续下一个任务之前成功完成每个任务很重要” 这不是上面的代码所做的,除非
doTask2和doTask3不执行它们的任务,而是返回稍后调用时将执行它们的函数。 -
“问题出现是因为其中一个任务本身是异步返回的——一旦任务成功启动,承诺就会实现。” 这似乎是一个非常奇怪的设计。使用 Promise 的目的是在异步任务完成之前设置它们。
-
恐怕不清楚你真正在做什么,这使得基本上不可能给你任何具体的帮助。 :-|
-
@T.J.Crowder “这不是上面的代码所做的” - 我认为确实如此 - 这些方法中的每一个都返回一个承诺,该承诺在任务完成时实现。
标签: typescript promise