【发布时间】:2023-03-07 10:04:01
【问题描述】:
我使用 TypeScript 和 async/await 来表示异步工作流。该工作流程的一部分是调用 Web Worker,并在它回调并返回结果时继续。
在 C# 中,我会创建一个 TaskCompletionSource、await 和它的 Task,而代码中的其他地方会调用 SetResult 来解析 TaskCompletionSource。
我可以在 JavaScript 中做同样的事情,方法是使用 Promise.defer()、awaiting 其 Promise 和其他地方初始化 Deferrer 对象,在 window.onmessage 侦听器中将调用 resolve(或 reject)方法让异步工作流继续。
听起来不错,但 MDN 说 defer 已过时。使用 Promise 构造函数的建议解决方案让委托完成工作并调用 resolve/reject 方法对我不起作用,因为该逻辑可能超出我的能力范围,我只想要对象要在完全不同的词法范围内调用 resolve 或 reject,我无法使用该函数来执行此操作。
有一个 Backwards and forwards compatible helper 通过绑定 resolve 和 reject 函数给我这样的对象,我可以在不改变代码语义的情况下使用它们。但这是一个不好的做法吗?有没有公认的更好的模式?什么是 JavaScript 中 TaskCompletionSource 的惯用等价物?
【问题讨论】:
标签: javascript c# asynchronous promise deferred