首页 > 解决方案 > 关于上下文管理器的任何提示,类似于 Javascript 中的 Python?

问题描述

我非常喜欢 Python 的上下文管理器,我不必担心之后如何获取或清理资源。有没有办法在Javascript中以一种简洁的方式做到这一点?

标签: 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')
}

推荐阅读