确保在转换功能内解决承诺



我正在通过2进行研究并续集。

我的代码:

  return Doc.createReadStream({
    where: { /*...*/ },
    include: [
      {
        /*...*/
      },
    ],
  })
  .pipe(through({ objectMode: true }, (doc, enc, cb) => {
    Comment.findOne(null, { where: { onId: doc.id } }).then((com) => { /* sequelize: findOne*/
      com.destroy(); /* sequelize instance destroy: http://docs.sequelizejs.com/manual/tutorial/instances.html#destroying-deleting-persistent-instances */
      cb();
    });
  }))
  .on('finish', () => {
    console.log('FINISHED');
  })
  .on('error', err => console.log('ERR', err));

我试图清楚地表达我的问题。DocComment是续集模型。我想使用流读取数据库的DOC实例,并在每个DOC实例上删除注释。Comment.findOnecom.destroy()都将返回承诺。我想为每个doc解决的承诺,然后致电cb()。但是我上述代码无法正常工作,在com被销毁之前,这些代码已经完成。

如何修复它?谢谢

我将上述代码包裹在mocha测试中,例如

it('should be found by readstream', function _testStream(){
  /* wrap the first piece of codes here*/
});

但是在流完成之前,已经存在测试。

您可以通过返回承诺并使用另一个.then来等待另一个承诺。

在运行.destroy()之前,您可能需要检查com结果是null

  .pipe(through({ objectMode: true }, (doc, enc, cb) => {
    Comment.findOne(null, { where: { onId: doc.id } })
      .then(com => com.destroy())
      .then(()=> cb())
      .catch(cb)
  }))

然后,在摩卡咖啡中运行测试时,您需要通过将done添加到测试功能签名并在完成时调用done()来等待异步流。

it('should be found by readstream', function _testStream(done){
  ...
  .on('finish', () => done())
  .on('error', done)
})

相关内容

  • 没有找到相关文章

最新更新