2017-01-09 13 views
1

以下のコード、入力ファイル、および結果を考慮してください。 setTimeoutは、http getなどの外部呼び出しを模倣するためのものです。結果を順番に保つ最も簡単な方法は何ですか?明白に追加された待ち時間と同時に実行されていないことは大丈夫です。 rl.pause()とrl.resume()は、下線の入力ストリームを一時停止しているか、おそらくここで何かが見つからないため、このトリックはしません。実際にreadlineを一時停止する方法はありますか?

'use strict'; 

let rl = require('readline').createInterface({ 
    input: require('fs').createReadStream('inputFile') 
}); 

rl.on('line', line => { 
    rl.pause(); 
    setTimeout(_ => { 
     console.log(line); 
     rl.resume(); 
    }, Math.random() * 2000); 
}); 

で、inputFile:

1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 

結果:

10 
6 
1 
11 
3 
7 
8 
9 
12 
2 
5 
4 

答えて

2

これはreadlineモジュールはNodeJSでどのように動作するかの制限事項です。それは入力の読み込みを一時停止しますが、すぐには行いません。これは、ノードストリームが行うように設計されたものが原因です。

およびresumeは、背圧を処理することを目的としたものであり、その目標は、消費者がノードにバランスをとるために「速すぎる」生産者に対処することであったことを意味する。彼らは、物事がすぐに中断されることを保証するという文脈で決して設計されていませんでした。

より低いレベルのfsオペレーションを使用して、行を1つずつ読み込んだり、バッファに格納してこれを克服することができます。ファイルが十分に小さい場合は、fs.readFileを実行して\nで分割すれば、それを約束して反復し、非同期アクションを実行するだけで十分です。

+0

他の言葉:いいえ。ありがとうございます。 – niry

+0

@niryかなり - はい。 –

関連する問題