ждать внутри функции обещания - PullRequest
0 голосов
/ 12 октября 2019

Как я могу использовать await внутри return new Promise((resolve, reject) => { ... }?

Вот мой код:

async function write_file(file1, file2){
  return new Promise((resolve, reject) => {
    const stream = fs_extra.createWriteStream(file2);

    stream.write(await fs_extra.readFile(file1), async () => await fs_extra.unlink(file1));

    stream.on('finish', () => resolve());
    stream.on('error', error => reject(error));

    stream.end();
  }

}

Я получаю синтаксические ошибки так же, как когда я использую await в неасинхронной функции, но дажеесли я добавлю `async до (разрешить, отклонить), я все равно получу синтаксические ошибки ...

Ответы [ 2 ]

1 голос
/ 12 октября 2019

Вы не! И вы не передаете асинхронную функцию в качестве обратного вызова для write. Вы уже прочитали файл к этому моменту, поэтому вы можете удалить его сразу или параллельно с остальными.

async function write_file(file1, file2) {
  const stream = fs_extra.createWriteStream(file2);

  stream.end(await fs_extra.readFile(file1));
  const unlinkP = fs_extra.unlink(file1);
  unlinkP.catch(() => {});
  // or just await fs_extra.unlink(file1);

  await new Promise((resolve, reject) => {
    stream.on('finish', resolve);
    stream.on('error', reject);
  });

  await unlinkP;
}

Вызов stream.end() после получения события finish не приводит кбольшого смысла тоже.

0 голосов
/ 12 октября 2019

Я не знаю, какую функциональность вы хотите достичь, но если вам нужен правильный синтаксис, то он выглядит следующим образом:

async function write_file(file1, file2) {
    return new Promise(async (resolve, reject) => {
        const stream = fs_extra.createWriteStream(file2)

        stream.write(await fs_extra.readFile(file1), async () => await fs_extra.unlink(file1))

        stream.on("finish", () => resolve())
        stream.on("error", error => reject(error))

        stream.end()
    })
}

Шаги по исправлению синтаксиса

  1. Поставьте закрывающую скобку после 2-й последней закрывающей фигурной скобки.
  2. Добавьте async перед (разрешить, отклонить) в строке 2.
...