回答編集履歴

2

a

2016/04/06 21:57

投稿

mpyw
mpyw

スコア5223

test CHANGED
@@ -52,7 +52,11 @@
52
52
 
53
53
  buffer = '';
54
54
 
55
+ if (str !== '') {
56
+
55
- handler(str);
57
+ handler(str);
58
+
59
+ }
56
60
 
57
61
  });
58
62
 

1

a

2016/04/06 21:57

投稿

mpyw
mpyw

スコア5223

test CHANGED
@@ -1,6 +1,8 @@
1
1
  改行コードが右端に入っている,とかのオチでしょう.末尾の改行コードを削除すればいいだけですが,それに加えて一応**確実に**行単位で読み出しができるように書いてみます.(Node.js v5.10.0 で動作確認)
2
2
 
3
3
 
4
+
5
+ (reader.js)
4
6
 
5
7
  ```javascript
6
8
 
@@ -8,36 +10,114 @@
8
10
 
9
11
 
10
12
 
11
- function linify(lineHandler)
13
+ class LineReader
12
14
 
13
15
  {
14
16
 
15
- let buffer = '';
17
+ constructor(stream)
16
18
 
17
- return function (chunk) {
19
+ {
18
20
 
19
- buffer += chunk;
21
+ this.stream = stream;
20
22
 
21
- let m;
23
+ }
22
24
 
23
- while (m = buffer.match(/([\s\S]*?)\r?\n$([\s\S]*)/m)) {
24
25
 
25
- lineHandler(m[1]);
26
26
 
27
- buffer = m[2];
27
+ onLine(handler)
28
28
 
29
- }
29
+ {
30
30
 
31
+ let buffer = '';
32
+
33
+ this.stream.on('data', chunk => {
34
+
35
+ buffer += chunk.toString();
36
+
37
+ let m;
38
+
39
+ while (m = buffer.match(/([\s\S]*?)\r?\n([\s\S]*)/m)) {
40
+
41
+ handler(m[1]);
42
+
43
+ buffer = m[2];
44
+
45
+ }
46
+
31
- };
47
+ });
48
+
49
+ this.stream.on('end', () => {
50
+
51
+ let str = buffer;
52
+
53
+ buffer = '';
54
+
55
+ handler(str);
56
+
57
+ });
58
+
59
+ return this;
60
+
61
+ }
32
62
 
33
63
  }
34
64
 
35
65
 
36
66
 
37
- process.stdin.on('data', linify(function (line) {
67
+ new LineReader(process.stdin).onLine(line => console.log(JSON.stringify(line)));
38
-
39
- console.log(JSON.stringify(line));
40
-
41
- }));
42
68
 
43
69
  ```
70
+
71
+
72
+
73
+ 試しに以下のようなコードの出力を流し込んでみてください.
74
+
75
+
76
+
77
+ (writer.js)
78
+
79
+ ```JavaScript
80
+
81
+ 'use strict';
82
+
83
+
84
+
85
+ function sleep(ms)
86
+
87
+ {
88
+
89
+ return new Promise(r => setTimeout(r, ms));
90
+
91
+ }
92
+
93
+
94
+
95
+ Promise
96
+
97
+ .resolve()
98
+
99
+ .then(() => process.stdout.write("1行目: "))
100
+
101
+ .then(() => sleep(500))
102
+
103
+ .then(() => process.stdout.write("ab\n2行目: def"))
104
+
105
+ .then(() => sleep(500))
106
+
107
+ .then(() => process.stdout.write("\n"))
108
+
109
+ .then(() => sleep(500))
110
+
111
+ .then(() => process.stdout.write("3行目: 改行無しで終わります"))
112
+
113
+ ```
114
+
115
+
116
+
117
+ (ターミナル)
118
+
119
+ ```Bash
120
+
121
+ node writer.js | node reader.js
122
+
123
+ ```