2011-02-12 21 views
185

Qual è la differenza tra "process.stdout.write" e "console.log" in node.js?Differenza tra "process.stdout.write" e "console.log" in node.js?

MODIFICA: l'uso di console.log per una variabile mostrava molti caratteri illeggibili durante l'utilizzo di process.stdout.write ha mostrato un oggetto.

Perché è quello?

+3

Puoi fornire un esempio? console.log() chiama process.stdout.write con output formattato. Vedi format() in console.js per l'implementazione. –

+1

Postalo come risposta =) – ajsie

risposta

176

console.log() chiamate process.stdout.write con output formattato. Vedi format() in console.js per l'implementazione.

Attualmente (v0.10.ish):

Console.prototype.log = function() { 
    this._stdout.write(util.format.apply(this, arguments) + '\n'); 
}; 
107

Guardando la documentazione nodo apparentemente console.log è solo process.stdout.write con una linea-break alla fine:

console.log = function (d) { 
    process.stdout.write(d + '\n'); 
}; 

Fonte: http://nodejs.org/docs/v0.3.1/api/process.html#process.stdout

+9

Per le persone che arrivano più tardi, tieni presente che la v0.3.1 era molto tempo fa e le cose sono cambiate da allora. :) –

+4

... no. Basta guardare i documenti v0.9.9 e console.log è ancora solo un alias per process.stdout.write con un'interruzione di riga. Si prega di fare la tua ricerca prima di commentare. http://nodejs.org/docs/v0.9.9/api/process.html#process.stdout –

+10

1) v0.9.9 ha due anni 2) che la documentazione non è corretta, [come per v0.9.9 il formato viene interpolato tramite util] (https://github.com/joyent/node/blob/v0.9.9-release/lib/console.js#L52) –

38

so che questa è una domanda molto vecchio, ma non ho visto nessuno parlando della differenza principale tra process.stdout.write e console.log e voglio solo per me questo

Come Mauvis Leford e TK-421 rilevare, il console.log aggiunge un carattere line-break alla fine della linea (\n), ma non è tutto ciò che fa.

Il codice non è cambiato dalla versione almeno 0.10.X e ora abbiamo una versione 5.X.

Here è il codice:

Console.prototype.log = function() { 
    this._stdout.write(util.format.apply(this, arguments) + '\n'); 
}; 

Come si può vedere, c'è una parte che dice .apply(this, arguments) e che fa una grande differenza sulla funzionalità. E 'più facile spiegare che con gli esempi:

process.stdout.write ha una funzionalità molto semplice, si può solo scrivere qualcosa là dentro, in questo modo:

process.stdout.write("Hello World\n"); 

Se non si mette la linea di interruzione alla fine si otterrà un personaggio strano, dopo la stringa, qualcosa di simile:

process.stdout.write("Hello World"); //Hello World% 

(penso che significa qualcosa come "la fine del programma", così potrete vedere solo se si process.stdout.write è stato utilizzato al fine del tuo file e non l'hai fatto t aggiungere la linea di separazione)

D'altra parte, console.log può fare di più.

  1. Si può usare allo stesso modo

    console.log("Hello World"); //You don't need the break line here because it was already formated e anche quel personaggio strano è scomparsa

  2. È possibile scrivere più di una stringa

    console.log("Hello", "World");

  3. È può fare associazioni

    console.log("Hello %s", "World") //Useful when "World" is inside a variable

Un gioco è fatto, che ha aggiunto funzionalità è data grazie alla parte util.format.apply (ho potuto parlare molto su cosa esattamente questo fa ma si ottiene il mio punto, si può leggere di più here).

Spero che qualcuno trovi utile questa informazione.

+0

Sarebbe molto utile anche se hai spiegato come usare 'stdout.write' ed evitare di ottenere'% ' –

+0

Ho risolto il problema di ottenere'% 'alla fine semplicemente chiamando' process.stdout.write ('\ n '); 'alla fine del mio ciclo (se si dispone ad esempio) –

17

Una grande differenza che non è stata menzionata è che process.stdout accetta solo stringhe come argomenti (possono essere anche flussi di pipe), mentre console.log accetta qualsiasi tipo di dati Javascript.

es:

// ok 
console.log(null) 
console.log(undefined) 
console.log('hi') 
console.log(1) 
console.log([1]) 
console.log({one:1}) 
console.log(true) 
console.log(Symbol('mysymbol')) 

// any other data type passed as param will throw a TypeError 
process.stdout.write('1') 

// can also pipe a readable stream (assuming `file.txt` exists) 
const fs = require('fs') 
fs.createReadStream('file.txt').pipe(process.stdout) 
+0

Differenza molto grande e importante. Grazie! – chriskelly

1

Ho appena notato qualcosa durante la ricerca di questo dopo aver ottenuto aiuto con https.request per il metodo di inserimento. Ho pensato di condividere alcuni suggerimenti per aiutare a capire.

process.stdout.write non aggiunge una nuova riga mentre lo fa console.log, come altri hanno menzionato. Ma c'è anche questo che è più facile da spiegare con gli esempi.

var req = https.request(options, (res) => { 
    res.on('data', (d) => { 
     process.stdout.write(d); 
     console.log(d) 
    }); 
}); 

process.stdout.write(d); stamperà i dati correttamente senza una nuova linea. Tuttavia, console.log(d) stamperà una nuova riga ma i dati non verranno visualizzati correttamente, dando ad esempio questo <Buffer 12 34 56....

Per fare in modo che console.log(d) mostri correttamente le informazioni, dovrei farlo.

var req = https.request(options, (res) => { 
    var dataQueue = "";  
    res.on("data", function (d) { 
     dataQueue += d; 
    }); 
    res.on("end", function() { 
     console.log(dataQueue); 
    }); 
}); 

Quindi, fondamentalmente:

  • process.stdout.write stamperà in modo continuo le informazioni come i dati che vengono recuperati e non aggiunge una nuova linea.

  • console.log stampa le informazioni ottenute nel punto di recupero e aggiunge una nuova riga.

Questo è il modo migliore per spiegarlo.

2

Un'altra importante differenza in questo contesto sarebbe con process.stdout.clearLine() e process.stdout.cursorTo(0).

Questo sarebbe utile se si desidera mostrare la percentuale di download o di elaborazione nell'unica linea.Se usi clearLine(), cursorTo() con console.log(), non funziona perché aggiunge anche \ n al testo. Prova questo esempio:

var waitInterval = 500; 
var totalTime = 5000; 
var currentInterval = 0; 

function showPercentage(percentage){ 
    process.stdout.clearLine(); 
    process.stdout.cursorTo(0); 
    console.log(`Processing ${percentage}%...`); //replace this line with process.stdout.write(`Processing ${percentage}%...`); 
} 

var interval = setInterval(function(){ 
currentInterval += waitInterval; 
showPercentage((currentInterval/totalTime) * 100); 
}, waitInterval); 

setTimeout(function(){ 
clearInterval(interval); 
}, totalTime); 
Problemi correlati