通常,承诺使用异步/等待重写链
const f = () => Promise.resolve(1).then(a => a+1)可以翻译成
const f = async () => {
const a = await Promise.resolve(1)
return a+1
}如果我没有错的话,Javascript异步/等待是使用协同(比如生成器)实现的。
因此,在内部Javascript不会在执行之前将异步/等待代码转换为承诺链代码(不要考虑异步/等待语法糖)。
回顾一下断言要更改异步/等待到承诺链的我找到了一个播音器。这样做就是将异步/等待作为一种语法糖,在执行之前进行扩展。这样做比协同实现更有表现力。
现在我在想。
转换程序总是自动地重写每个异步/等待代码,而不会有任何问题吗?或者,在某些情况下,转移溢出不能自动产生与协同执行相同的结果?
以另一种方式回答同样的问题。为什么选择使用协同执行而不是转移到承诺链?因为转移溢出并不总是可能的?
发布于 2022-11-19 04:53:44
现在最好的解决方案是用TypeScript编写代码,并将target设置为ES5,然后将每个await/async都正确地替换为相应的Promise链。
https://stackoverflow.com/questions/73796783
复制相似问题