等待可读流 ES8 TypeScript 的完成,fs

Await the Completion of a Readable Stream ES8 TypeScript, fs

我的代码无法运行,因为文件在下一行执行之前尚未解压缩。 这是我的解压功能:

import { createGunzip } from 'zlib';
import { createReadStream, statSync, createWriteStream } from 'fs';

function fileExists(filePath: string) {
  try {
    return statSync(filePath).isFile();
  } catch (err) {
    return false;
  }
}

async function gunzipFile(source: string, destination: string): Promise<void> {
  if (!fileExists(source)) {
    console.error(`the source: ${source} does not exist`);
    return;
  }
  const src = createReadStream(source);
  const dest = createWriteStream(destination);
  await src.pipe(createGunzip())
    .pipe(dest)
    .on('error', (error) => {
      // error logging
    })
    .on('end', () => {
      return;
    });
}

我将如何重构它以使其正常异步工作?或者非异步,如果它会在完成之前等待。有类似的问题但是对我不起作用,可能是因为这个函数returns void,不是流出来的数据

src.pipe 不是 return 一个 Promise 然后你不能等待它。让我们将其转换为 Promise:

function gunzipFile(source: string, destination: string): Promise<void> {
  if (!fileExists(source)) {
    console.error(`the source: ${source} does not exist`);
    return;
  }
  const src = createReadStream(source);
  const dest = createWriteStream(destination);

  return new Promise((resolve, reject) => { // return Promise void
    src.pipe(createGunzip())
      .pipe(dest)
      .on('error', (error) => {
        // error logging
        // reject(error); // throw error to outside
      })
      .on('finish', () => {
        resolve(); // done
      });
  })
}