是否有 AsyncMethod() 的打字稿版本.结果?



在 C# 中,我可以通过调用Result属性来同步调用异步方法的结果。

例如:

var returnVal = AsyncMethod().Result;

打字稿中的等价物是什么?

async/await与此类似,但没有完全相同的。或者至少在浏览器或 Node 中运行时没有这样的事情。Result属性位于Task<T>类上。与 TypeScript 中的等价物是Promise<T>,这是描述承诺对象的类型。

TypeScript 在运行时只是 JS。JS运行时是主动异步的,因为JS被设计为在没有多个线程的情况下工作。相反,必须产生一个线程来确保任务之间的协作。所以JS强烈支持非阻塞API。

Result隐藏的副作用是,如果还没有可用的结果,它会阻塞线程,直到结果到达。在JS世界中,这将阻塞唯一的线程,因此您的其他代码都无法执行,并且很可能会阻止结果到达(除非承诺由某些系统调用直接返回(。

即使在 CLR 中,使用Result也是一种黑客和冒险的技巧。它经常导致死锁。如果要在任何地方使用async,则最好在 CLR 中随处使用。让异步性质"涟漪"到最高水平(例如控制器方法或Main(。

在JS(以及TS(中,你别无选择,只能做正确的事情并始终保持异步。这并不难。如果您有函数:

function f() {
const x = downloadSomething(); // x is a promise, I want the result
}

而是写:

async function f() {
const x = await downloadSomething();
}

现在f()也返回一个承诺,因此异步性"涟漪"。但是,在可能的情况下,这与您应该在 C# 中执行的操作完全相同。

相关内容

最新更新