2017-04-26 17 views
1

我想知道如果有一個簡單的方法來獲得「同步」的ReadLine或至少得到同步I/O的node.js的外觀如何在nodejs中使用async獲得同步readline或「模擬」它?

我用這樣的事情,但它是相當尷尬

var readline = require('readline'); 
var rl = readline.createInterface({ 
    input: process.stdin, 
    output: process.stdout, 
    terminal: false 
}); 

var i = 0; 
var s1 = ''; 
var s2 = ''; 

rl.on('line', function(line){ 
    if(i==0) { s1 = line; } 
    else if(i==1) { s2 = line; } 
    i++; 
}) 

rl.on('close', function() { 
    //do something with lines 
})' 

取而代之的是,如果它是爲像

var s1 = getline(); // or "await getline()?" 
var s2 = getline(); // or "await getline()?" 

有用條件容易,我寧願:

(一)不想使用外部模塊或/ dev /標準輸入輸出文件句柄,我提交代碼的代碼提交網站,這些都不在那裏工作

(B)可以使用異步/坐等或發電機

(c)應可以基於行的

(d)不應該要求閱讀整個標準輸入到內存中處理

+0

可能重複之前閱讀整個標準輸入[node.js:readSync從stdin?](http://stackoverflow.com/questions/3430939/node-js-readsync-from-stdin) – supersam654

+0

@ supersam654我添加了一些額外的條件去重複。我的條件是允許使用getline類型函數使用readline接口以乾淨的「同步」方式讀取(單個)行,或者使用「async/await」函數來模擬此行。 –

回答

0

之前,因爲我不知道有多少串需要我把他們都在一個陣列

不要猶豫以評論你是否需要更多的細節領導回答,或者如果我的回答是不準確的:

var readline = require('readline'); 
var rl = readline.createInterface({ 
    input: process.stdin, 
    output: process.stdout, 
    terminal: false 
}); 

var i = 0; 
var strings = []; 

rl.on('line', function(line) { 
    // 2 lines below are in case you want to stop the interface after 10 lines 
    // if (i == 9) 
    // rl.close() 
    strings[i] = line 
    i++ 
}).on('close', function() { 
    console.log(strings) 
}) 
// this is in case you want to stop the program when you type ctrl + C 
process.on('SIGINT', function() { 
    rl.close() 
}) 
+0

這需要讀取整個標準輸入內存,我寧願這不是這樣,因爲我通過標準輸入讀取大文件,並需要流 –

+0

它是一個流,所以它進入內存的唯一原因是因爲我把它放在變量字符串,但如果你做了其他的事情,它不會進入內存 – Amine

+0

我明白。但我想要的東西像在perl中'my $ line = <>'。或者在C++中使用getline。這很難嗎?我覺得我的要求不是那麼古怪,而且我想象它是用發電機或異步/等待完成的 –

0

下面是一個例子,但它需要得到的結果卻是不理想

var rl = readline.createInterface({ 
    input: process.stdin, 
    output: process.stdout, 
    terminal: false 
}); 


function lineiterator() { 
    var currLine = 0; 
    var lines = []; 
    return new Promise(function(resolve, reject) { 

     rl.on('line', function (line){ 
      lines.push(line) 
     }) 
     rl.on('close', function() { 
      resolve({ 
       next: function() { 
        return currLine < lines.length ? lines[currLine++]: null; 
       } 
      }); 
     }) 
    }) 
} 

lineiterator().then(function(x) { 
    console.log(x.next()) 
    console.log(x.next()) 
}) 

$ echo test$\ntest | node test.js 
test 
test 
相關問題