【问题标题】:How to await the on 'end' event of a Node Stream API?如何等待节点流 API 的“结束”事件?
【发布时间】:2021-05-13 14:34:13
【问题描述】:

我需要等待此 API 的任务完成,然后才能转到下一个任务。 我如何在这个语法中添加一个 promise / await?

我需要使用 enqueue 函数,然后等待流完成,然后再继续执行任何其他代码。我尝试使用 .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);

【问题讨论】:

    标签: node.js async-await promise stream


    【解决方案1】:

    您的代码几乎没有问题,但为了使用 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 中并像这样返回 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 事件发出)。

    【讨论】:

      猜你喜欢
      • 2016-06-15
      • 1970-01-01
      • 2021-07-24
      • 1970-01-01
      • 2019-10-17
      • 1970-01-01
      • 1970-01-01
      • 2016-10-16
      • 2014-06-06
      相关资源
      最近更新 更多