2016-12-19 6 views
1

У меня есть этот фрагмент кода:Если `drain` событие будет зарегистрировано в результате записи доступен

const file = fs.createWriteStream('./test.txt'); 
let written = true; 

// handler is added before even an attempt to write is made 
file.on('drain', function() { 
    written = true; 
    console.log('drained'); 
}); 

const interval = setInterval(function() { 
    if (Date.now() - time > 10000) { 
     clearInterval(interval); 
    } 

    if (written) { 
     written = file.write(new Array(1000000).join('z')); 
    } 
}, 100); 

Я интересно, если это стандартная практика, чтобы добавить обработчику даже попытку записи сделал?

ответ

1

В случае использования file.on('drain') слушатель вы настроили обычный прослушиватель, чтобы вытереть событие вашего потока. Примечание: этот слушатель будет удален после закрытия записываемого потока.

Как правило, этот код будет работать правильно, но наиболее распространенной практикой в ​​Node.js является использование обработчика stream.once('drain') для каждого случая превышения внутреннего буфера. Этот подход подпадает под действие документации Node.js для Event: 'drain':

function writeOneMillionTimes(writer, data, encoding, callback) { 
    var i = 1000000; 
    write(); 
    function write() { 
     var ok = true; 

     do { 
      i -= 1; 
      if (i === 0) { 
       // last time! 
       writer.write(data, encoding, callback); 
      } else { 
       // see if we should continue, or wait 
       // don't pass the callback, because we're not done yet. 
       ok = writer.write(data, encoding); 
      } 
     } while (i > 0 && ok); 

     if (i > 0) { 
      // had to stop early! 
      // write some more once it drains 
      writer.once('drain', write); 
     } 
    } 
} 
Смежные вопросы