末尾の改行なしでコンソールに出力する方法はありますか? console
オブジェクト ドキュメント はそれに関して何も言いません:
console.log()
改行付きで標準出力に出力します。この関数は
printf()
のように複数の引数を取ることができます。例:console.log('count: %d', count);
最初の文字列にフォーマット要素が見つからない場合は、各引数に
util.inspect
が使用されます。
また、カウントダウンなど、同じ行のメッセージを上書きしたい場合は、文字列の最後に '\ r'を追加することもできます。
process.stdout.write("Downloading " + data.length + " bytes\r");
Windowsコンソール(Linuxも)では、 '\ r'をそれと等価なコードに置き換えてください \033 [0G :
process.stdout.write('ok\033[0G');
これはVT220端末エスケープシーケンスを使用してカーソルを最初の列に送ります。
util.print も使用できます。読んでください: http://nodejs.org/api/util.html#util_util_print
util.print([...])#同期出力関数です。プロセスをブロックし、各引数を文字列にキャストしてから標準出力に出力します。各引数の後に改行を入れません。
例:
// get total length
var len = parseInt(response.headers['content-length'], 10);
var cur = 0;
// handle the response
response.on('data', function(chunk) {
cur += chunk.length;
util.print("Downloading " + (100.0 * cur / len).toFixed(2) + "% " + cur + " bytes\r");
});
行を上書きできることに関して上記の@rodowiによってなされた素晴らしい追加への拡張/強化として:
process.stdout.write("Downloading " + data.length + " bytes\r");
私のコードで見たように、端末カーソルを最初の文字に配置したくない場合は、次のことを検討してください。
let dots = ''
process.stdout.write(`Loading `)
let tmrID = setInterval(() => {
dots += '.'
process.stdout.write(`\rLoading ${dots}`)
}, 1000)
setTimeout(() => {
clearInterval(tmrID)
console.log(`\rLoaded in [3500 ms]`)
}, 3500)
次のprintステートメントの前に\r
を置くことによって、置換ストリングが前のストリングを上書きする直前にカーソルがリセットされます。
process.stdout.write
を示唆する答えはたくさんあるようです。代わりにエラーログをprocess.stderr
に発行する必要があります(console.error
を使用してください)。なぜprocess.stdout.write( '\ 033 [0G');何もしていなかったのは、stdoutがバッファされていて、drain
イベントを待つ必要があるからです( StdoutがNodeJSをフラッシュしますか? を参照)。 writeがfalseを返すと、drain
イベントが発生します。
厳密モードを使用するとエラーが発生しました。
ノードエラー: "8進数リテラルは厳密モードでは使用できません。"
私はここで答えを見つけました: https://github.com/SBoudrias/Inquirer.js/issues/111
process.stdout.write( "受信:" + bytesReceived + "\ x1B [0G");
これらの解決策のどれも私のために働きません。 process.stdout.write( 'ok\033 [0G')と '\ r'を使用して新しい行を作成するだけで、上書きしないでください。
編集:私は現在の行を置き換えるためにこれを使用しなければならなかった
process.stdout.write( '\ 033 [0G'); process.stdout.write( 'newstuff');