Убедитесь, что обещание разрешено внутри transformFunction
Мои коды:
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));
Я пытаюсь четко выразить свой вопрос. Doc
а также Comment
являются моделями. Я хочу использовать поток для чтения экземпляров Doc из базы данных по одному и удаления комментариев к каждому экземпляру Doc. Comment.findOne
а также com.destroy()
оба вернут обещания. Я хочу, чтобы обещания были выполнены для каждого doc
а затем позвоните cb()
, Но мои выше коды не могут работать, прежде чем com
быть уничтожены, коды уже заканчивают работать.
Как это исправить? Спасибо
Я завернуть вышеупомянутый кусок кодов в mocha
тест, как
it('should be found by readstream', function _testStream(){
/* wrap the first piece of codes here*/
});
Но до того как поток завершит чтение, тест существует.
1 ответ
Вы можете подождать другое обещание, вернув обещание и используя другое .then
,
Вам может понадобиться проверить наличие com
результат быть null
как хорошо, прежде чем бежать .destroy()
,
.pipe(through({ objectMode: true }, (doc, enc, cb) => {
Comment.findOne(null, { where: { onId: doc.id } })
.then(com => com.destroy())
.then(()=> cb())
.catch(cb)
}))
Затем при запуске теста в mocha вам нужно дождаться асинхронного потока, добавив done
к тестовой функции подписи и вызова done()
по завершении или по ошибке.
it('should be found by readstream', function _testStream(done){
...
.on('finish', () => done())
.on('error', done)
})