【发布时间】:2020-03-27 07:29:17
【问题描述】:
我正在编写一个 Windows Node.js 服务器应用程序(使用 ES6 顺便说一句)。
我想做的第一件事 - 在顶级代码中 - 是坐在一个 while 循环中,调用一个搜索特定注册表键/值的异步函数。此函数已被“证明” - 如果找到,则返回值数据,否则抛出:
async GetRegValue(): Promise<string> { ... }
我需要坐在一个while循环中,直到注册表项存在,然后获取值数据。 (重试之间有延迟)。 我想我知道如何等待异步调用完成(一种或另一种方式),然后再进行其余的启动,但我不知道如何坐在循环中等待它 成功。
请就如何实现这一目标提供任何建议? (我对 typescript 还很陌生,仍然难以理解所有异步/等待场景!)
谢谢
编辑
谢谢各位。我知道我对我的代码“含糊不清”——我不想尝试我的真实/伪代码,因为它们可能都忽略了你希望能帮助我理解的要点。 所以我只是将其保留为文字描述......不过我会尝试:
async GetRegValue(): Promise<string> {
const val: RegistryItem = await this.GetKeyValue(this.KEY_SW, this.VAL_CONN);
return val.value
}
private async GetKeyValue(key: string, name: string): Promise<RegistryItem> {
return await new Promise((resolve, reject) => {
new this.Registry({
hive: this.Hive, key
}).get(name, (err, items) => {
if (err) {
reject(new Error('Registry get failed'));
}
else {
resolve( items );
}
});
})
.catch(err => { throw err });
}
所以我想做这样的事情:
let keyObtained = false
let val
while (keyObtained == false)
{
// Call GetRegValue until val returned, in which case break from loop
// If exception then pause (e.g. ~100ms), then loop again
}
}
// Don't execute here till while loop has exited
// Then use 'val' for the subsequent statements
正如我所说,GetRegValue() 在我使用它的其他地方工作正常,但在这里我试图暂停进一步执行(并重试),直到它返回一个值
【问题讨论】:
-
使用
await或then。 -
你能提供一个更好的例子来说明你在做什么吗?
-
请提供您尝试执行
while循环的实际代码。您不能在 Javascript 中执行while循环旋转以等待某事发生,因为这会占用 JS 的单线程,而您正在等待的事情永远无法自行运行。因此,我们需要查看实际代码并了解您实际在等待什么,以便最好地建议如何编写代码。真实代码,真实数据,敬请期待。包括尽可能多的细节。 -
Javascript 是一种事件驱动的语言。这意味着了解某事何时发生的有效方法是为您正在等待的事物触发的事件注册一个事件侦听器。你不投票,你不
while()循环它,等等......如何为你想要的改变设置一个事件监听器完全取决于你没有透露它是什么,所以我们无法回答你的问题照原样。 -
这里最好的设计是更新注册表以公开您可以注册感兴趣的事件或回调的代码。你不想成为
pollingnode.js 中的一个值(非常低效)。您没有显示这个Registry对象是什么。也许它有自己的活动可以注册。如果没有,那么您应该集中所有修改注册表的代码并创建某种通知,其他代码可以在某个值更改时注册。这将创建一个事件驱动的解决方案,这是在 node.js 中编程的适当方式。
标签: node.js typescript async-await