await fs writefile с puppeteer не ждет, пока файл будет записан, прежде чем продолжать цикл обработки событий - PullRequest
0 голосов
/ 24 сентября 2019

Я использую nodemon для запуска моего приложения с nodemon index.js

В моем index.js файле я инициализирую свои функции, используя Puppeteer

INDEX.JS

const dotenv = require("dotenv");
const reddit = require("./reddit");

(async () => {
  // ...
  await reddit.initialize();
  await reddit.login(username, password);
  const results = await reddit.getResults();
  console.log('got results');
})();

Все это работает, как и ожидалось.

В моей функции initialize() я настроил Puppeteer опции

REDDIT.JS

const puppeteer = require("puppeteer");
const fs = require("fs");

const self = {
  browser: null,
  page: null,

  initialize: async () => {
    // Select browser
    self.browser = await puppeteer.launch({
      headless: true,
      slowMo: 10,
      defaultViewport: null
    });
    //  create new page
    self.page = await self.browser.newPage();
  },
};

module.exports = self;

Когда у меня возникла проблема, моя getResults() функция

getResults: async () => {
    // ...
    await self.page.goto(SUBREDDIT_URL(reddit), { waitUntil: "networkidle0" });
    const elements = await self.page.$$(
      '#siteTable > div[class*="thing"]:not(.promoted)'
    );
    const results = [];

    await Promise.all(
      elements.map(async element => {
        // ... logic done that pushes items to results array
      })
    );
    console.log("about to write to file");

    await fs.writeFile(
      `${__dirname}/results.json`,
      JSON.stringify(results),
      err => {
        console.log("currently writing");
        if (err) return false;
        return true;
      }
    );

    console.log("finished writing to file");

    return await Promise.all(results);
}

Когда я ее запускаю, я получаю в консоли следующее:

about to write to file
finished writing to file
got results
currently writing

Я ожидал

about to write to file
currently writing
finished writing to file
got results

Где я ошибся в том, что моя функция завершается до того, как записан файл?

Любая помощь будет принята с благодарностью.

1 Ответ

2 голосов
/ 24 сентября 2019

Обычная версия fs.writeFile() не возвращает обещание и, следовательно, await ничего не делает.await делает что-то полезное только в том случае, если вы ожидаете обещание.

В последних версиях node.js есть поддержка обещаний для модуля fs.Вы можете сделать это следующим образом:

const fsp = require('fs').promises;

async function someFunc() {
    await fsp.writeFile('someFilename', someData);
    // other code here
}

Обратите внимание, что мое соглашение заключается в названии импортированного модуля fsp вместо fs, чтобы сделать более очевидным, что он отличается от простого fs.

...