如何等待节点流 API 的 on 'end' 事件?

How to await the on 'end' event of a Node Stream API?

我需要等待 API 的任务完成,然后再进行下一个任务。 我如何向此语法添加承诺/等待?

我需要使用排队功能,然后等待流完成,然后再继续任何进一步的代码。我尝试通过 .on('end', {}) 调用返回一个承诺,但没有成功。

非常感谢任何帮助。

const {SiteChecker} = require('broken-link-checker');

const siteChecker = new SiteChecker(options)
  .on('error', (error) => {})
  .on('robots', (robots, customData) => {})
  .on('html', (tree, robots, response, pageURL, customData) => {})
  .on('queue', () => {})
  .on('junk', (result, customData) => {})
  .on('link', (result, customData) => {})
  .on('page', (error, pageURL, customData) => {})
  .on('site', (error, siteURL, customData) => {})
  .on('end', () => {});

siteChecker.enqueue(siteURL, customData);

您的代码几乎没问题,但为了使用 Promises,您需要将整个代码包装在其中。你会像这样实现:

const {SiteChecker} = require('broken-link-checker');

const siteChecker = new SiteChecker(options)
  .on('error', (error) => {})
  .on('robots', (robots, customData) => {})
  .on('html', (tree, robots, response, pageURL, customData) => {})
  .on('queue', () => {})
  .on('junk', (result, customData) => {})
  .on('link', (result, customData) => {})
  .on('page', (error, pageURL, customData) => {})
  .on('site', (error, siteURL, customData) => {});

await new Promise((resolve, reject) => siteChecker
       .on('end', resolve) 
       // resolve is a function that you call when the work is done
       .on('error' => reject)
       // reject is the function you call when the task fails
       .enqueue(siteURL, customData);
);

现在我不确定 broken-link-checker 在你的情况下是如何工作的,但如果你想重用整个解决方案,那么最好将整个事情包装在 promise 和 return siteChecker 引用如下:

const {SiteChecker} = require('broken-link-checker');

const siteChecker = await new Promise((resolve, reject) => {
  const _sitechecker = new SiteChecker(options)
    .on('error', (error) => {})
    .on('robots', (robots, customData) => {})
    .on('html', (tree, robots, response, pageURL, customData) => {})
    .on('queue', () => {})
    .on('junk', (result, customData) => {})
    .on('link', (result, customData) => {})
    .on('page', (error, pageURL, customData) => {})
    .on('site', (error, siteURL, customData) => {});
    .on('end', () => resolve(_sitechecker))
    // notice that the sitechecker is passed here
    .on('error' => reject);

    sitechecker.enqueue(siteURL, customData);
});

这两种写法都会等到完成(或直到发出 end 事件)。