javascript - 关于上下文管理器的任何提示,类似于 Javascript 中的 Python?
问题描述
我非常喜欢 Python 的上下文管理器,我不必担心之后如何获取或清理资源。有没有办法在Javascript中以一种简洁的方式做到这一点?
解决方案
您可以使用 javascript 中的生成器函数进行类似的操作:
function* usingGroup() {
// setup
console.group()
try {
yield
} finally {
// cleanup
console.groupEnd()
}
}
要使用它,您可以使用for ... of
循环:
for(const _ of usingGroup()) {
console.log('inside a group')
}
此方法类似于您在 python 中使用@contextmanager
装饰器定义上下文管理器的方式。尽管在我看来,使用 for 循环来定义上下文应用的方式感觉很奇怪。
它是如何工作的:
抽象出整个生成器对象和迭代器协议,你可以认为它是这样做的:在循环的第一次迭代之前,生成器函数内部的代码一直运行到yield
语句,此时,for循环体运行一次生成器已经产生了一个值,在下一次迭代之前,生成器中的其余代码将运行。由于它没有产生,循环认为它完成并退出而不再次执行它的主体。这try ... finally
确保即使抛出错误,代码也会被执行。
如果您需要在循环中使用某些值(例如您打开的文件),您可以yield
在生成器中使用它。
完整代码:
function* usingGroup() {
console.group()
try {
yield
} finally {
console.groupEnd()
}
}
for(const _ of usingGroup()) {
console.log('inside a group')
}
推荐阅读
- php - 如何修复 MessageFormatter 返回格式不正确的日期?
- virtual-machine - 通过 Softlayer API 创建 IBM VM 需要更长的时间
- css - Angular FlexLayout 将所有设备的选择元素和 fab-mini 对齐在同一行,但在边界上未对齐
- excel - 表格列的vba应用格式
- python - 聚类前的标准化
- c# - 在 azure 函数 c#.net 核心中检测图像倾斜角度并修复没有 system.drawing 库
- go - 关闭和发送到通道之间的竞争条件
- python - 我们可以根据python中的'id'过滤字典吗?
- go - 一个结构多个 json 表示
- android - react native 中的平滑闪屏过渡