【问题标题】:Node.js Readable self.push() stops after working 15 iterationsNode.js 可读 self.push() 在工作 15 次迭代后停止
【发布时间】:2018-04-13 14:34:52
【问题描述】:

我试图理解为什么这段代码中的Readable = require('stream').Readable 在 node.js 上只能工作 15 次。我省略了X.on('data',function() {console.log('data')}); 这一行,它无限重复,这是正确的。

start.js

console.log('Start Therm');
const thermom = require('./therm.js');

var X = new thermom();
X._read();

X.on('start',function() {console.log('start')});

// X.on('data',function() {console.log('data')});

X.on('end',function() {console.log('end')});
X.on('error',function() {console.log('error')});

therm.js

var Readable = require('stream').Readable;  
var util = require('util');
var _ = require('lodash');
var count=0;
function getTemperatureReadingFromThermometer(cb) {
  setTimeout(function() {
    cb(null, Math.round(Math.random() * 20 * 100)/100) 
  }, 10);
}


module.exports = Thermometer;

function Thermometer(options) {
  this.count = 0;
  if (! (this instanceof Thermometer)) {
    return new Thermometer(options);
  }
  if (! options) { 
    options = {};
  }
  options.objectMode = true;
  Readable.call(this, options);

}

util.inherits(Thermometer, Readable);


Thermometer.prototype._read = function read() {
  var self = this;

  getTemperatureReadingFromThermometer(
    function(err, temperature) {
    console.log('getTemperatureReadingFromThermometer :' + temperature );
    if (err) { 
      self.emit('error', err);
    } else {
      console.log('self.push(temperature) :  ' +  count++);
      self.push();
    }
  });
};

node start.js 仅输出 15 次迭代。

Start Therm
getTemperatureReadingFromThermometer :7.98
self.push(temperature) :  0
getTemperatureReadingFromThermometer :18.46
self.push(temperature) :  1
getTemperatureReadingFromThermometer :13.27
self.push(temperature) :  2
getTemperatureReadingFromThermometer :1.6
self.push(temperature) :  3
getTemperatureReadingFromThermometer :18.08
self.push(temperature) :  4
getTemperatureReadingFromThermometer :2.08
self.push(temperature) :  5
getTemperatureReadingFromThermometer :10.91
self.push(temperature) :  6
getTemperatureReadingFromThermometer :13
self.push(temperature) :  7
getTemperatureReadingFromThermometer :9.98
self.push(temperature) :  8
getTemperatureReadingFromThermometer :14.4
self.push(temperature) :  9
getTemperatureReadingFromThermometer :6.69
self.push(temperature) :  10
getTemperatureReadingFromThermometer :12.14
self.push(temperature) :  11
getTemperatureReadingFromThermometer :3.65
self.push(temperature) :  12
getTemperatureReadingFromThermometer :13.54
self.push(temperature) :  13
getTemperatureReadingFromThermometer :16.59
self.push(temperature) :  14
getTemperatureReadingFromThermometer :1.69
self.push(temperature) :  15

任何提示将不胜感激

【问题讨论】:

    标签: javascript node.js stream readable


    【解决方案1】:

    我终于找到了这个难题的答案。

     var X = new thermom({highWaterMark: 500 }); 
    

    会给你这个队列中 500 个项目的缓冲区,同样 5 的 highWaterMark 会将迭代减少到只有 5。它记录在 node.js 中 https://nodejs.org/api/stream.html#stream_new_stream_readable_options

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-28
      • 1970-01-01
      • 2013-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-06
      相关资源
      最近更新 更多