¿Cuál es la diferencia entre "process.stdout.write" y "console.log" en node.js?
EDITAR: El uso de console.log para una variable mostró muchos caracteres ilegibles mientras que el proceso.stdout.write mostró un objeto.
¿Porqué es eso?
¿Cuál es la diferencia entre "process.stdout.write" y "console.log" en node.js?
EDITAR: El uso de console.log para una variable mostró muchos caracteres ilegibles mientras que el proceso.stdout.write mostró un objeto.
¿Porqué es eso?
Respuestas:
console.log()
llamadas process.stdout.write
con salida formateada. Ver format()
en console.js para la implementación.
Actualmente (v0.10.ish):
Console.prototype.log = function() {
this._stdout.write(util.format.apply(this, arguments) + '\n');
};
console.log()
parece agregar una nueva línea
Al mirar los documentos del nodo, aparentemente console.log es solo process.stdout.write con un salto de línea al final:
console.log = function (d) {
process.stdout.write(d + '\n');
};
Fuente: http://nodejs.org/docs/v0.3.1/api/process.html#process.stdout
Sé que esta es una pregunta muy antigua, pero no vi a nadie hablando sobre la diferencia principal entre process.stdout.write
y console.log
solo quiero mencionarla.
Como señalaron Mauvis Leford y TK-421 , console.log
agrega un line-break
personaje al final de la línea ( \n
), pero eso no es todo lo que hace.
El código no ha cambiado desde al menos la 0.10.X
versión y ahora tenemos una 5.X
versión.
Aquí está el código:
Console.prototype.log = function() {
this._stdout.write(util.format.apply(this, arguments) + '\n');
};
Como puede ver, hay una parte que dice .apply(this, arguments)
y que hace una gran diferencia en la funcionalidad. Es más fácil explicar eso con ejemplos:
process.stdout.write
tiene una funcionalidad muy básica, puedes escribir algo allí, como este:
process.stdout.write("Hello World\n");
Si no pones la línea de ruptura al final, obtendrás un personaje extraño después de tu cadena, algo como esto:
process.stdout.write("Hello World"); //Hello World%
(Creo que eso significa algo así como "el final del programa", por lo que lo verá solo si process.stdout.write
se utilizó al final de su archivo y no agregó la línea de corte)
Por otro lado, console.log
puede hacer más.
Puedes usarlo de la misma manera
console.log("Hello World"); //You don't need the break line here because it was already formated
y también ese extraño personaje desapareció
Puedes escribir más de una cadena
console.log("Hello", "World");
Puedes hacer asociaciones
console.log("Hello %s", "World") //Useful when "World" is inside a variable
Y eso es todo, esa funcionalidad adicional se da gracias a la util.format.apply
parte (podría hablar mucho sobre qué hace exactamente esto, pero entiendes mi punto, puedes leer más aquí ).
Espero que alguien encuentre útil esta información.
stdout.write
y evitar el contacto%
%
al final simplemente llamando process.stdout.write('\n');
al final de mi ciclo (si tienes, por ejemplo)
%
es solo la forma en que el shell dice que no hay una nueva línea al final del archivo.
%
en el archivo
Una gran diferencia que no se ha mencionado es que process.stdout solo toma cadenas como argumentos (también se pueden canalizar flujos), mientras que console.log toma cualquier tipo de datos Javascript.
p.ej:
// 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)
Otra diferencia importante en este contexto sería con process.stdout.clearLine()
y process.stdout.cursorTo(0)
.
Esto sería útil si desea mostrar el porcentaje de descarga o procesamiento en la única línea. Si usa clearLine (), cursorTo () con console.log()
él no funciona porque también agrega \ n al texto. Solo prueba este ejemplo:
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);
Acabo de notar algo al investigar esto después de obtener ayuda con https.request para el método de publicación. Pensé que comparto algunos aportes para ayudar a entender.
process.stdout.write
no agrega una nueva línea mientras lo console.log
hace, como otros habían mencionado. Pero también hay esto que es más fácil de explicar con ejemplos.
var req = https.request(options, (res) => {
res.on('data', (d) => {
process.stdout.write(d);
console.log(d)
});
});
process.stdout.write(d);
imprimirá los datos correctamente sin una nueva línea. Sin embargo console.log(d)
, imprimirá una nueva línea pero los datos no se mostrarán correctamente, <Buffer 12 34 56...
por ejemplo.
Para console.log(d)
mostrar la información correctamente, tendría que hacer esto.
var req = https.request(options, (res) => {
var dataQueue = "";
res.on("data", function (d) {
dataQueue += d;
});
res.on("end", function () {
console.log(dataQueue);
});
});
Así que básicamente:
process.stdout.write
imprime continuamente la información a medida que se recuperan los datos y no agrega una nueva línea.
console.log
imprime la información que se obtuvo en el punto de recuperación y agrega una nueva línea.
Esa es la mejor manera en que puedo explicarlo.
La diferencia simple es: los métodos console.log () añaden automáticamente un nuevo carácter de línea. Significa que si estamos recorriendo e imprimiendo el resultado, cada resultado se imprime en una nueva línea.
Los métodos process.stdout.write () no agregan un nuevo carácter de línea. útil para imprimir patrones.
Console.log implemente process.sdout.write, process.sdout.write es un búfer / flujo que saldrá directamente en su consola.
De acuerdo con mi línea de servidor puglin : console = new Console(consoleOptions)
puede volver a escribir la clase de consola con su propio sistema de línea de lectura .
Puede ver el código fuente de console.log:
Ver más :