【发布时间】:2018-04-19 17:19:53
【问题描述】:
我在 TypeScript/JavaScript 中有一个漫长而复杂的异步过程,分布在许多库和函数中,当它最终完成接收和处理所有数据时,调用一个函数 processComplete() 来表示它已经完成:
processComplete(); // Let the program know we're done processing
现在,该函数看起来像这样:
let complete = false;
function processComplete() {
complete = true;
}
为了确定进程是否完成,其他代码要么使用超时,要么使用process.nextTick 并在循环中一遍又一遍地检查complete 变量。这既复杂又低效。
我想让各种async 函数简单地使用await 等待并在过程完成时被唤醒:
// This code will appear in many different places
await /* something regarding completion */;
console.log("We're done!");
如果我在 Windows 中使用 C 进行编程,我会使用 event synchronization primitive,代码看起来像这样:
Event complete;
void processComplete() {
SetEvent(complete);
}
// Elsewhere, repeated in many different places
WaitForSingleObject(complete, INFINITE);
console.log("We're done!");
在 JavaScript 或 TypeScript 中,除了将布尔值 complete 设置为 true,processComplete 究竟可以做什么来唤醒正在使用 await 等待的任意数量的函数?换句话说,如何使用await 和async 或Promises 实现事件同步原语?
【问题讨论】:
-
承诺就是这样。只需解决一个承诺并
await它。 -
@SLaks 我无法弄清楚如何提前创建承诺,以便事情可以等待它,然后在以后调用
processComplete时解决它。 -
您能否编辑您的问题以包含触发进程启动的代码和调用
processComplete的代码? -
@JohnSpeeks — 哦,Angular 有一个成熟的事件系统。您可以传递事件发射器或 observable 并根据需要订阅它,而不是传递
complete变量。 angular.io/api/core/EventEmitter -
只需将
complete = true;替换为resolve()并将整个内容包装成一个巨大的 Promise。或者花点时间将它全部重构为基于 Promises。
标签: javascript typescript promise async-await