Я пытаюсь удалить несколько временных файлов, которые были созданы во время функции dispose в расширении кода Visual Studio. По какой-то причине 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
в самом высоком расположении завершается неудачно, потому что каталог не пуст, даже когда я смотрю.