async/await是否总是可以被Promises链自动替换



通常,Promises链可以使用async/await重写

const f = () => Promise.resolve(1).then(a => a+1)

可以翻译成

const f = async () => {
const a = await Promise.resolve(1)
return a+1
}

如果我在Javascript中没有错的话,async/await是使用协程(比如生成器(实现的。

因此,在内部,Javascript在执行之前永远不会将async/await代码转换为promise链代码(不要将async/await视为语法糖(。

环顾四周,我发现了一个声称将async/await更改为promise链的transiler。这样做就是将async/await作为语法糖,在执行之前进行扩展。这样做表明,它甚至比协同例程实现更具性能。

现在我在想。

那个转发器能总是自动重写每个异步/等待代码而没有任何问题吗?或者在某些情况下,转换编译不能自动给出与协程实现相同的结果?

用另一种方式回答同样的问题。为什么选择使用协程实现而不可移植到Promises链?因为转译并不总是可能的?

目前最好的解决方案是用TypeScript编写代码,将target设置为ES5,然后每个await/async都将始终正确地替换为相应的Promise链。

最新更新