2017-01-20 1 views
1

Я пытаюсь создать Дуплексный поток, который получает несколько объектов, реорганизует их, а затем передает их в любой поток, который читается из моего потока. Боли в том, что часть чтения должна начинаться только после того, как все объекты были получены (другими словами, после финишного события).Как оживить поток Дуплекс до завершения события завершения, чтобы начать отправку данных?

Как я могу это сделать?

Моя нынешняя идея заключается в том, что у меня было бы два разных потока (вместо дуплекса), и я просто разъясню свой API, что Readable stream не должен использоваться до того, как поток Writable сообщает вам сделать это - но это кажется настолько неправильным!

Итак, пожалуйста, есть ли лучший способ сделать это? Спасибо заранее.

ответ

0

Найден ответ! Похоже, вы можете сказать, что потребительский поток ждет, просто не звонив this.push(), пока вы не будете готовы ответить. Все, что мне нужно было сделать, это установить флаг, чтобы поток дуплекса знал, что потребитель ждет данных, а затем используйте событие на источнике, чтобы проверить этот флаг и вызвать this._read, если флаг был истинным. Код выглядит следующим образом:

constructor(source, options){ 
    super(options); 

    this._isReady = false; 
    source.on('end'() => { 
    this._isReady = true; 
    if(this._isOnHold) this._read(); 
    }) 
} 

_read(){ 
    if(!this._isReady) { 
    this._isOnHold = true; 
    } 

    // regular push sub-routine 
} 

Конечно, все это будет внутри подкласса дуплексного потока.

Смежные вопросы