Jaka jest różnica między „process.stdout.write” a „console.log” w node.js?
EDYCJA: Użycie console.log dla zmiennej pokazało wiele nieczytelnych znaków, natomiast użycie process.stdout.write pokazało obiekt.
Dlaczego?
Jaka jest różnica między „process.stdout.write” a „console.log” w node.js?
EDYCJA: Użycie console.log dla zmiennej pokazało wiele nieczytelnych znaków, natomiast użycie process.stdout.write pokazało obiekt.
Dlaczego?
Odpowiedzi:
console.log()wywołania process.stdout.writeze sformatowanym wyjściem. Zobacz format()implementację w pliku console.js.
Obecnie (v0.10.ish):
Console.prototype.log = function() {
this._stdout.write(util.format.apply(this, arguments) + '\n');
};
console.log()wydaje się, że dodaje nowy wiersz
Patrząc na dokumenty Node najwyraźniej console.log to po prostu process.stdout.write z podziałem linii na końcu:
console.log = function (d) {
process.stdout.write(d + '\n');
};
Źródło: http://nodejs.org/docs/v0.3.1/api/process.html#process.stdout
Wiem, że to jest bardzo stare pytanie, ale nie widzę ktoś mówi o głównej różnicy między process.stdout.writei console.loga ja po prostu chce go wymienić.
Jak zauważyli Mauvis Leford i TK-421 , znak console.logdodaje line-breakznak na końcu linii ( \n), ale to nie wszystko, co robi.
Kod nie zmienił się od co najmniej 0.10.Xwersji, a teraz mamy 5.Xwersję.
Oto kod:
Console.prototype.log = function() {
this._stdout.write(util.format.apply(this, arguments) + '\n');
};
Jak widać, jest część, która mówi .apply(this, arguments)i która ma duży wpływ na funkcjonalność. Łatwiej to wyjaśnić przykładami:
process.stdout.write ma bardzo podstawową funkcjonalność, możesz po prostu coś tam napisać, na przykład:
process.stdout.write("Hello World\n");
Jeśli nie umieścisz linii końca na końcu, po łańcuchu otrzymasz dziwny znak, coś takiego:
process.stdout.write("Hello World"); //Hello World%
(Myślę, że to oznacza coś w rodzaju „końca programu”, więc zobaczysz to tylko wtedy, gdy process.stdout.writebył używany na końcu pliku i nie dodałeś linii podziału)
Z drugiej strony console.logmożna zrobić więcej.
Możesz użyć tego w ten sam sposób
console.log("Hello World"); //You don't need the break line here because it was already formated a także ta dziwna postać zniknęła
Możesz napisać więcej niż jeden ciąg
console.log("Hello", "World");
Możesz tworzyć skojarzenia
console.log("Hello %s", "World") //Useful when "World" is inside a variable
I o to chodzi, że dzięki tej util.format.applyczęści została dodana dodatkowa funkcjonalność (mogłem dużo mówić o tym, co to dokładnie robi, ale rozumiesz, o czym więcej możesz przeczytać tutaj ).
Mam nadzieję, że ktoś uzna te informacje za przydatne.
stdout.writei jak unikać%
%na koniec, po prostu dzwoniąc process.stdout.write('\n');na końcu mojej pętli (jeśli masz na przykład)
%to po prostu sposób powiedzenia powłoki, że na końcu pliku nie ma nowej linii.
%w pliku
Jedną z dużych różnic, o której nie wspomniano, jest to, że process.stdout przyjmuje tylko łańcuchy jako argumenty (mogą być również strumieniami potokowymi), podczas gdy console.log przyjmuje dowolny typ danych JavaScript.
na przykład:
// 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)
Inną ważną różnicą w tym kontekście byłoby process.stdout.clearLine()i process.stdout.cursorTo(0).
Byłoby to przydatne, jeśli chcesz pokazać procent pobierania lub przetwarzania w jednym wierszu. Jeśli użyjesz funkcji clearLine (), kursorTo () z console.log()nią nie działa, ponieważ dodaje \ n również do tekstu. Wypróbuj ten przykład:
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);
Właśnie zauważyłem coś podczas badania tego po uzyskaniu pomocy w https.request dla metody post. Pomyślałem, że podzielę się pewnym wkładem, aby pomóc zrozumieć.
process.stdout.writenie dodaje nowej linii, podczas gdy console.logrobi, jak inni wspominali. Ale jest też coś, co łatwiej wyjaśnić przykładami.
var req = https.request(options, (res) => {
res.on('data', (d) => {
process.stdout.write(d);
console.log(d)
});
});
process.stdout.write(d);wydrukuje dane poprawnie bez nowej linii. Jednak console.log(d)wydrukuje nowy wiersz, ale dane nie będą wyświetlane poprawnie, podając to <Buffer 12 34 56...na przykład.
Aby console.log(d)poprawnie wyświetlić informacje, musiałbym to zrobić.
var req = https.request(options, (res) => {
var dataQueue = "";
res.on("data", function (d) {
dataQueue += d;
});
res.on("end", function () {
console.log(dataQueue);
});
});
Więc w zasadzie:
process.stdout.write ciągle drukuje informacje podczas pobierania danych i nie dodaje nowego wiersza.
console.log wypisuje informacje uzyskane w momencie wyszukiwania i dodaje nową linię.
To najlepszy sposób, żeby to wyjaśnić.
Prosta różnica polega na tym, że: metody console.log () automatycznie dodają nowy znak wiersza. Oznacza to, że jeśli przeglądamy i drukujemy wynik, każdy wynik jest drukowany w nowej linii.
Metody process.stdout.write () nie dodają nowego znaku linii. przydatne do drukowania wzorów.
Console.log implement process.sdout.write, process.sdout.write to bufor / strumień, który będzie bezpośrednio wysyłany do konsoli.
Według mojego puglin serverline : console = new Console(consoleOptions)można przerobić klasę Console z własnym readline systemu.
Możesz zobaczyć źródło kodu console.log:
Zobacz więcej :