我正试图删除在Visual Studio Code扩展中的dispose函数期间创建的一堆临时文件。出于某种原因,即使我前面有forEach
,在执行该工作之前,仍会返回启动大量异步工作的await
。我对forEach
,await
的理解还是在单个dispose
函数中正在完成的工作是否有问题?
public async dispose(): Promise<any> {
return new Promise(async (err) => {
await this.disposables.forEach(async disposable => {
await disposable.dispose();
});
this.disposables.clear();
let rmdir = promisify(fs.rmdir);
let tempDir = this.getTempDir();
try {
await rmdir(tempDir);
} catch (err) {
try {
this.outChannel.appendLine(`Error deleting ${tempDir}: ${err}.`);
} catch (err2) { }
}
});
}
一次性用品的内容是使用以下代码创建的:
this.disposables.set(relativePath, {dispose: async () => {
let unlink = promisify(fs.unlink);
let rmdir = promisify(fs.rmdir);
let readdir = promisify(fs.readdir);
try {
try {
this.outChannel.appendLine(`Cleaning up ${tempFullPath}...`);
} catch(err2) { }
await unlink(tempFullPath);
relativePath = path.dirname(relativePath);
while (/[^\\\.]+/.test(relativePath)) {
let parent = path.join(tempDir,relativePath);
if ((await readdir(parent)).length === 0) {
await rmdir(parent);
}
relativePath = path.dirname(relativePath);
}
} catch (err) {
try {
this.outChannel.appendLine(`Failed - ${err}.`);
} catch(err3) { }
}
return;
}});
结果是最高处置中的最后一个rmdir
失败,因为即使在我查看时该目录也不为空。