2017-12-01 2 views
0

sequelize을 공부 중입니다.promise가 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)); 

나는 분명 내 질문을 표현하려합니다. DocComment은 모델을 후편으로 처리합니다. 스트림을 사용하여 데이터베이스에서 Doc 인스턴스를 하나씩 읽고 각 Doc 인스턴스에 대한 주석을 삭제하려고합니다. Comment.findOnecom.destroy()은 모두 약속을 반환합니다. 나는 각각 doc에 대해 해결 된 약속을 원하고 cb()으로 전화하십시오. 하지만 위의 코드는 작동하지 않습니다. com이 삭제되기 전에 코드가 이미 실행을 마칩니다.

문제를 해결하는 방법은 무엇입니까? 감사합니다

나는

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

처럼 mocha 테스트 코드의 위 부분을 포장하지만 스트림이 읽기 완료하기 전에, 테스트가 존재한다.

답변

0

약속을 반환하고 다른 .then을 사용하여 다른 약속을 기다릴 수 있습니다.

.destroy()을 실행하기 전에 null 인 결과가 com인지 확인해야 할 수도 있습니다. 모카에서 테스트를 실행할 때

.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) 
}) 
+0

하지만 지금은''기다릴 ''을 사용할 수 없다. – BAE

+0

첫 번째 해결책을 시도했지만, 스트림이 읽기를 끝내기 전에 테스트가 존재했다. 문제는 전체 약속 체인이 비동기 적이라는 것입니다. – BAE

+0

아 맞습니다. 비동기 테스트의 끝을 나타 내기 위해 모카와 스트림에서'done'을 사용해야합니다. – Matt

관련 문제