【发布时间】:2018-07-13 07:34:33
【问题描述】:
以这个函数为例
async function foo () {
const res = await fetchData()
const out = await processData(res)
return out
}
想象一下,我注意到 fetchData 很慢,我想使用通用计时器函数/生成器快速分析:
async function foo () {
for (let time of timer()) {
const res = await fetchData()
}
const out = await processData(res) // error res is undefined
return out
}
这会破坏代码,因为不再定义 res。我可以在块之前定义let res,或者使用var,但这意味着修改一些临时分析代码的源代码。我想这正是const 的重点是scoping to statements。不过,我还是觉得有办法保持范围,并在一组行前后触发一个事件?
我没有嫁给发电机。闭包可以做同样的工作,但有相同的范围问题。欢迎提供其他语法建议。
如何包装一些任意代码块但保持变量范围?也许是a proxy?类似于 python 的上下文管理器。这可能处于语言限制的边缘?
【问题讨论】:
-
似乎您可以使用接受回调或承诺并返回结果的分析函数
-
您已经确定了两种解决方案(使用
let预定义或使用var)。如果您在块内移动let或const声明,则将其范围缩小到仅该块。没有办法解决这个问题——这就是语言定义。通过将其包装在一个块中,您缩小了在该块中定义的变量的范围,使用const或let。如果不更改块内的代码,就无法解决这个问题。 -
请注意,将分析计时器实现为生成器将是一个巨大的错误。由于其可中断控制流的性质,生成器函数会导致巨大的性能损失。如果您不相信我,请尝试对生成器函数与等效的 for 循环进行基准测试。
-
@PatrickRoberts 这只是为了分析,所以它几乎永远不会投入生产。生成器的速度足以满足我的要求。但是我对任何其他语法持开放态度。我没有与生成器、回调或块结婚
-
我没有看到使用
var的问题,但我猜肯定有各种分析选项不需要任何代码更改
标签: javascript ecmascript-6 ecmascript-2017