在C#中,我可以通过调用Result
属性来同步调用异步方法的结果。
例如:
var returnVal = AsyncMethod().Result;
在打字稿中这相当于什么?
答案 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#中应该做的完全一样。