Python 中的
with
语句对于清理资源很有用,例如
with open('file.txt', 'w') as f:
// do something with the file
代码的编写者不必担心关闭文件,因为
open
函数的编写者已经实现了清理文件资源所需的东西。
JavaScript 中实现此功能的常见模式有哪些?
给出这段Python代码:
# 1. Prepare arguments
x = A()
# 2. Acquire resource
with B(x) as y:
# ACQUISITION SUCCEEDED...
# 3. Use resource
z = C(y)
# ...RELEASE IMPLICIT
# 4. Return result
return D(z)
您可以将其翻译成 JavaScript,如下所示:
// 1. Prepare arguments
let x = A();
// 2. Acquire resource
let y = await B.#acquire(x);
// ACQUISITION SUCCEEDED...
let z;
try {
// 3. Use resource
z = await C(y);
} finally {
// ...RELEASE EXPLICIT
B.#release(y);
}
// 4. Return result
return await D(z);
或者,如果你保证能够获得一个与需要在资源上完成的操作的最终状态相一致的 Promise,你可以将其写为:
// 1. Prepare arguments
let x = A();
// 2. Acquire resource
let y = await B.#acquire(x);
// ACQUISITION SUCCEEDED...
// 3. Use resource
let z = Promise.try(C, y);
// ...RELEASE EXPLICIT
z.finally(() => {B.#release(y);});
z = await z;
// 4. Return resource
return await D(z);
当您同时处理许多操作并需要类似 Python 的东西时,后一种模式可能很有用
contextlib.ExitStack