采用此示例函数
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的上下文管理器。这可能是语言限制的边缘?
答案 0 :(得分:0)
您怎么看待这样的事情?
async function timed(p) {
const start = performance.now();
const res = await p();
const end = performance.now();
console.log('time elapsed', end - start);
return res;
}
async function foo () {
const res = await timed(fetchData);
const out = await processData(res);
return out
}
答案 1 :(得分:0)
我不知道“使用通用计时器功能/生成器快速配置fetchData
”是什么意思。我只能看到你将语句移动到一个循环中,显然可能会多次执行或根本不执行,因此您无法轻松地将一个结果值分配给外部作用域res
变量。
如果你想在某些数据结构上使用循环,是的,只需使用let res
并从循环中获取最后一个值(或者在循环体未运行的情况下获取初始值)。
如果您想对fetchData
功能进行概要分析,请查看How to measure the execution time of a promise?。