是否有AsyncMethod()。Result的打字稿版本?

时间:2018-06-30 06:15:20

标签: typescript

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

例如:

var returnVal = AsyncMethod().Result;

在打字稿中这相当于什么?

1 个答案:

答案 0 :(得分:1)

async / await与此类似,但没有完全相同的东西。或者至少在浏览器或Node中运行时没有这种东西。 Result属性在Task<T>类上。 TypeScript中的等效项是Promise<T>,它是描述promise对象的类型。

TypeScript在运行时只是JS。 JS运行时是积极异步的,因为JS设计为无需多个线程即可工作。相反,必须产生一个线程来确保任务之间的协作。因此,JS强烈支持非阻塞API。

Result的隐藏副作用是,如果尚无可用结果,它将阻塞线程直到结果到达。在JS世界中,这将阻塞 only 线程,因此您的其他任何代码都将无法执行,这很可能会阻止结果到达(除非promise由某些系统直接返回)致电)。

即使在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()还返回了一个promise,因此异步性“荡然无存”。但这与您在C#中应该做的完全一样。