В ожидании каждого результата - PullRequest
0 голосов
/ 05 марта 2019

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

...