Nodejs createReadStream True Async

时间:2014-10-04 17:55:18

标签: javascript node.js asynchronous stream filesystems

我创建了一个模块来分割文件' \ r \ n'并将每一行发送到app.js监听器。 以下是模块的快照代码。

var fs = require('fs');
var util = require('util');
var EventEmitter = require('events').EventEmitter;

var data_array = [];


function STF(fname){

  if (!(this instanceof STF)) {
    return new STF(fname);
  }
  this.fname = fname;
  var counts=0;
  this.counts = counts;
}

util.inherits(STF, EventEmitter);

STF.prototype.readLines=function readLines(){
  var self = this;
  var time = process.hrtime();
  var input = fs.createReadStream(this.fname);

  var remaining = '';
  input.on('data', function(data) {

    remaining += data;
    var index = remaining.indexOf('\r\n');
    while (index > -1) {
      self.counts++;
      var line = remaining.substring(0, index);
      remaining = remaining.substring(index + 1);
      data_array.push(line);
      index = remaining.indexOf('\r\n');
      //console.log(line);
      self.emit('line',line,process.hrtime(time),self.counts);
    }
  });

  input.on('end', function() {
    if (remaining.length > 0) {
      console.log('Leftover: '+remaining);
      data_array.push(remaining);
    }
    self.emit('array',data_array,process.hrtime(time));


  });

  input.on('error',function(err){
    self.emit('error',err);
  });

}

module.exports = STF;

我的应用程序创建了2个加载了不同文件的模块的新实例,并为每个实例添加了监听器。

  var STF = require('./stf.js');
  var test = new STF('A1B.file');
  var test2 = new STF('A1TI.file');

  test.on('array',function(data,time,count){
    //console.log(data);
  });

  test.on('line',function(data,time,count){
    //console.log(data);
    console.log('A1B:::::::::::::::::::::::: '+time,count);
  });

  test2.on('array',function(data,time,count){
    //console.log(data);
  });

  test2.on('line',function(data,time,count){
    //console.log(data);
    console.log('A1TI::  '+time,count);
  });
  test2.readLines();
  test.readLines();

我的代码的部分结果如下所示:

    A1TI::  0,425262376 490
    A1TI::  0,425756742 491
    A1TI::  0,426177125 492
    A1TI::  0,426620173 493
    A1TI::  0,427051246 494
    A1B:::::::::::::::::::::::: 0,426992657 372
    A1B:::::::::::::::::::::::: 0,427497715 373
    A1B:::::::::::::::::::::::: 0,427928361 374
    A1B:::::::::::::::::::::::: 0,428358152 375
    A1B:::::::::::::::::::::::: 0,428786232 376
    A1B:::::::::::::::::::::::: 0,429217306 377
    A1B:::::::::::::::::::::::: 0,429645386 378
    A1B:::::::::::::::::::::::: 0,430100408 379
    A1B:::::::::::::::::::::::: 0,430565267 380
    A1B:::::::::::::::::::::::: 0,431001472 381
    A1B:::::::::::::::::::::::: 0,431477449 382
    A1B:::::::::::::::::::::::: 0,431902964 383
    A1B:::::::::::::::::::::::: 0,432334037 384
    A1B:::::::::::::::::::::::: 0,432809159 385
    A1B:::::::::::::::::::::::: 0,433348429 386
    A1B:::::::::::::::::::::::: 0,433819702 387
    A1B:::::::::::::::::::::::: 0,434271303 388
    A1B:::::::::::::::::::::::: 0,434702805 389
    A1B:::::::::::::::::::::::: 0,435139010 390
    A1B:::::::::::::::::::::::: 0,435578637 391
    A1B:::::::::::::::::::::::: 0,436037508 392
    A1B:::::::::::::::::::::::: 0,436451904 393
    A1B:::::::::::::::::::::::: 0,436868437 394
    A1B:::::::::::::::::::::::: 0,437438070 395
    A1B:::::::::::::::::::::::: 0,437864868 396
    A1B:::::::::::::::::::::::: 0,438327160 397
    A1B:::::::::::::::::::::::: 0,438799716 398
    A1B:::::::::::::::::::::::: 0,439244902 399
    A1B:::::::::::::::::::::::: 0,439669989 400
    A1B:::::::::::::::::::::::: 0,440128005 401
    A1B:::::::::::::::::::::::: 0,440544966 402
    A1B:::::::::::::::::::::::: 0,441036339 403
    A1B:::::::::::::::::::::::: 0,441516165 404
    A1B:::::::::::::::::::::::: 0,441976747 405
    A1B:::::::::::::::::::::::: 0,442480521 406
    A1B:::::::::::::::::::::::: 0,442927418 407
    A1B:::::::::::::::::::::::: 0,443472675 408
    A1B:::::::::::::::::::::::: 0,443924276 409
    A1B:::::::::::::::::::::::: 0,444369035 410
    A1B:::::::::::::::::::::::: 0,444814221 411
    A1B:::::::::::::::::::::::: 0,445266677 412
    A1B:::::::::::::::::::::::: 0,445685349 413
    A1B:::::::::::::::::::::::: 0,446134812 414
    A1B:::::::::::::::::::::::: 0,446554339 415
    A1B:::::::::::::::::::::::: 0,447000381 416
    A1B:::::::::::::::::::::::: 0,447436586 417
    A1B:::::::::::::::::::::::: 0,447907859 418
    A1B:::::::::::::::::::::::: 0,448356039 419
    A1B:::::::::::::::::::::::: 0,448796521 420
    A1B:::::::::::::::::::::::: 0,449245129 421
    A1B:::::::::::::::::::::::: 0,449723244 422
    A1B:::::::::::::::::::::::: 0,450223598 423
    A1B:::::::::::::::::::::::: 0,450791520 424
    A1B:::::::::::::::::::::::: 0,451458231 425
    A1B:::::::::::::::::::::::: 0,451982105 426
    A1B:::::::::::::::::::::::: 0,452548317 427
    A1B:::::::::::::::::::::::: 0,453083310 428
    A1B:::::::::::::::::::::::: 0,453572117 429
    A1B:::::::::::::::::::::::: 0,454091287 430
    A1B:::::::::::::::::::::::: 0,454527065 431
    A1B:::::::::::::::::::::::: 0,455027846 432
    A1B:::::::::::::::::::::::: 0,455476026 433
    A1B:::::::::::::::::::::::: 0,455912232 434
    A1B:::::::::::::::::::::::: 0,456366826 435
    A1B:::::::::::::::::::::::: 0,456863759 436
    A1B:::::::::::::::::::::::: 0,457317070 437
    A1B:::::::::::::::::::::::: 0,457758835 438
    A1B:::::::::::::::::::::::: 0,458191620 439
    A1B:::::::::::::::::::::::: 0,458659899 440
    A1B:::::::::::::::::::::::: 0,459090545 441
    A1B:::::::::::::::::::::::: 0,459516060 442
    A1B:::::::::::::::::::::::: 0,459953548 443
    A1B:::::::::::::::::::::::: 0,460386760 444
    A1B:::::::::::::::::::::::: 0,460824249 445
    A1B:::::::::::::::::::::::: 0,461253184 446
    A1B:::::::::::::::::::::::: 0,461676133 447
    A1B:::::::::::::::::::::::: 0,462105496 448
    A1B:::::::::::::::::::::::: 0,462534003 449
    A1B:::::::::::::::::::::::: 0,462959945 450
    A1B:::::::::::::::::::::::: 0,463426087 451
    A1B:::::::::::::::::::::::: 0,463880681 452
    A1B:::::::::::::::::::::::: 0,464371626 453
    A1B:::::::::::::::::::::::: 0,464866848 454
    A1B:::::::::::::::::::::::: 0,465302198 455
    A1B:::::::::::::::::::::::: 0,465733700 456
    A1B:::::::::::::::::::::::: 0,466184445 457
    A1B:::::::::::::::::::::::: 0,466690786 458
    A1B:::::::::::::::::::::::: 0,467174889 459
    A1B:::::::::::::::::::::::: 0,467606818 460
    A1B:::::::::::::::::::::::: 0,468117007 461
    A1B:::::::::::::::::::::::: 0,468543377 462
    A1B:::::::::::::::::::::::: 0,469048007 463
    A1B:::::::::::::::::::::::: 0,469470955 464
    A1B:::::::::::::::::::::::: 0,469884923 465
    A1B:::::::::::::::::::::::: 0,470324550 466
    A1B:::::::::::::::::::::::: 0,470746643 467
    A1B:::::::::::::::::::::::: 0,471202093 468
    A1B:::::::::::::::::::::::: 0,471628890 469
    A1B:::::::::::::::::::::::: 0,472128816 470
    A1B:::::::::::::::::::::::: 0,472595384 471
    A1B:::::::::::::::::::::::: 0,473091461 472
    A1B:::::::::::::::::::::::: 0,473549477 473
    A1B:::::::::::::::::::::::: 0,473962162 474
    A1B:::::::::::::::::::::::: 0,474409059 475
    A1B:::::::::::::::::::::::: 0,474842271 476
    A1B:::::::::::::::::::::::: 0,475334927 477
    A1B:::::::::::::::::::::::: 0,475833997 478
    A1B:::::::::::::::::::::::: 0,476282605 479
    A1B:::::::::::::::::::::::: 0,476713678 480
    A1B:::::::::::::::::::::::: 0,477156726 481
    A1B:::::::::::::::::::::::: 0,477570266 482
    A1B:::::::::::::::::::::::: 0,478079600 483
    A1B:::::::::::::::::::::::: 0,478530346 484
    A1B:::::::::::::::::::::::: 0,479006751 485
    A1B:::::::::::::::::::::::: 0,479551153 486
    A1B:::::::::::::::::::::::: 0,480061342 487
    A1B:::::::::::::::::::::::: 0,480487284 488
    A1B:::::::::::::::::::::::: 0,480899969 489
    A1B:::::::::::::::::::::::: 0,481521348 490
    A1B:::::::::::::::::::::::: 0,481973804 491
    A1B:::::::::::::::::::::::: 0,482422412 492
    A1B:::::::::::::::::::::::: 0,482835097 493
    A1B:::::::::::::::::::::::: 0,483317489 494
    A1TI::  0,484679135 495
    A1TI::  0,485216266 496
    A1TI::  0,485742279 497
    A1TI::  0,486227237 498
    A1TI::  0,486674134 499
    A1TI::  0,487127445 500
    A1TI::  0,487537992 501
    A1TI::  0,487973770 502
    A1TI::  0,488392869 503
    A1TI::  0,488840194 504
    A1TI::  0,489251596 505
    A1TI::  0,489715599 506
    A1TI::  0,490158219 507
    A1TI::  0,490578174 508
    A1TI::  0,491020794 509
    A1TI::  0,491448019 510
    A1TI::  0,491941102 511
    A1TI::  0,492403822 512
    A1TI::  0,492867825 513
    A1TI::  0,493332684 514
    A1TI::  0,493759908 515
    A1TI::  0,494264538 516
    A1TI::  0,494692191 517
    A1TI::  0,495180570 518
    A1TI::  0,495587695 519
    A1TI::  0,496034165 520
    A1TI::  0,496475074 521
    A1TI::  0,496927103 522
    A1TI::  0,497385974 523
    A1TI::  0,497831588 524
    A1TI::  0,498271643 525
    A1TI::  0,498680906 526
    A1TI::  0,499120533 527
    A1TI::  0,499538349 528
    A1TI::  0,500105417 529
    A1TI::  0,500698998 530
    A1TI::  0,501199352 531
    A1TI::  0,501674474 532
    A1TI::  0,502114101 533
    A1TI::  0,502525075 534
    A1TI::  0,502962563 535
    A1TI::  0,503373537 536
    A1TI::  0,503828560 537
    A1TI::  0,504277167 538
    A1TI::  0,504695411 539
    A1TI::  0,505141025 540
    A1TI::  0,505550289 541
    A1TI::  0,506002745 542
    A1TI::  0,506443227 543
    A1TI::  0,506915355 544
    A1TI::  0,507373371 545
    A1TI::  0,507832670 546
    A1TI::  0,508292397 547
    A1TI::  0,508717483 548
    A1TI::  0,509237936 549
    A1TI::  0,509678846 550
    A1TI::  0,510116762 551
    A1TI::  0,510526453 552
    A1TI::  0,510970357 553
    A1TI::  0,511380903 554
    A1TI::  0,511937279 555
    A1TI::  0,512414967 556
    A1TI::  0,512872555 557
    A1TI::  0,513283957 558
    A1TI::  0,513691082 559
    A1TI::  0,514134130 560
    A1TI::  0,514545104 561
    A1TI::  0,514983876 562
    A1TI::  0,515452155 563
    A1TI::  0,515960634 564
    A1TI::  0,516437039 565
    A1TI::  0,516916865 566
    A1TI::  0,517391987 567
    A1TI::  0,517870103 568
    A1TI::  0,518336244 569
    A1TI::  0,518747646 570
    A1TI::  0,519193687 571
    A1TI::  0,519672658 572
    A1TI::  0,520116989 573

结果不是我所期待的;

我希望看到A1TI&要按照A1TI>>等顺序在每个换行符上发出和打印A1B行。 A1B>> A1TI>> A1B等。

我的代码的结果似乎打印了A1B行的122~124>> 122-124 A1T线>> A1B线的122~124

我无法弄清楚这个神奇数字的来源。有人可以开导我吗?

提前致谢

1 个答案:

答案 0 :(得分:0)

您可以使用缓冲区大小来控制一次读取的数据量:

fs.createReadStream(this.fname,{'bufferSize': xxx});

但是在你的情况下,如果你真的需要替代线路,我认为你应该重新考虑你的结构,也许使用双向通信(子进程),这样你的应用就可以告诉test和test2它何时准备接收下一行