नोड.जेएस में "process.stdout.write" और "कंसोल.लॉग" के बीच अंतर?


323

नोड.जेएस में "process.stdout.write" और "कंसोल.लॉग" के बीच अंतर क्या है?

EDIT: एक वेरिएबल के लिए कंसोल.लॉग का उपयोग करते हुए, प्रक्रिया का उपयोग करते समय बहुत सारे अपठनीय अक्षर दिखाए गए ।stdout.write ने एक ऑब्जेक्ट दिखाया।

ऐसा क्यों है?


4
क्या आप एक उदाहरण प्रदान कर सकते हैं? कंसोल.लॉग () कॉल करता है। स्वरूपित आउटपुट के साथ process.stdout.write। कार्यान्वयन के लिए कंसोल.जेएस में प्रारूप () देखें।
TK-421

जवाबों:


324

console.log()process.stdout.writeस्वरूपित आउटपुट के साथ कॉल । format()कार्यान्वयन के लिए कंसोल। Js में देखें ।

वर्तमान में (v0.10.ish):

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

34
यह भी ध्यान देने योग्य है कि console.log()एक नई
पंक्ति

143

स्पष्ट रूप से सांकेतिक शब्दों में बदलना नोड डॉक्स को देखते हुए। अंत में एक लाइन-ब्रेक के साथ सिर्फ process.stdout.write है:

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

स्रोत: http://nodejs.org/docs/v0.3.1/api/process.html#process.stdout


18
बाद में साथ आने वाले लोगों के लिए, कृपया ध्यान दें कि v0.3.1 बहुत पहले था और तब से चीजें बदल गई हैं। :)
ब्रेंडन

5
... नहीं। बस v0.9.9 डॉक्स और कंसोल को देखा। अभी भी सिर्फ एक उपनाम है process.stdout.write के लिए एक लाइनब्रेक के साथ। टिप्पणी करने से पहले कृपया अपना शोध करें। नोडज ..org
docs/

13
1) v0.9.9 दो साल पुराना है 2) प्रलेखन गलत है, जैसा
ब्रेंडन

4
दरअसल, ऐसा लगता है कि प्रलेखन कभी अद्यतन नहीं हुआ है और अभी भी आसपास है (किसी को भी?)। मैं इसे ठीक करने के लिए एक पीआर प्रस्तुत कर रहा हूँ, मुझे उस मुद्दे को सूचित करने के लिए धन्यवाद :)
ब्रेंडन


66

मैं जानता हूँ कि यह एक बहुत पुरानी सवाल है, लेकिन मैं किसी को भी बीच मुख्य अंतर के बारे में बात नहीं देखा था process.stdout.writeऔर console.logऔर मैं सिर्फ यह उल्लेख करना चाहते हैं।

जैसा कि मौविस लेफोर्ड और टीके -421 ने बताया, लाइन के अंत में console.logएक line-breakचरित्र जोड़ता है ( \n) लेकिन यह सब क्या नहीं करता है।

कम से कम 0.10.Xसंस्करण के बाद से कोड नहीं बदला है और अब हमारे पास एक 5.Xसंस्करण है।

यहाँ कोड है:

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

जैसा कि आप देख सकते हैं, एक ऐसा भाग है जो कहता है .apply(this, arguments)और जो कार्यक्षमता पर एक बड़ा अंतर डालता है। उदाहरण के साथ यह समझाना आसान है:

process.stdout.write एक बहुत ही बुनियादी कार्यक्षमता है, आप कुछ इस तरह से लिख सकते हैं:

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

यदि आप अंत में ब्रेक लाइन नहीं डालते हैं तो आपको अपनी स्ट्रिंग के बाद एक अजीब चरित्र मिलेगा, कुछ इस तरह से:

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

(मुझे लगता है कि "प्रोग्राम का अंत" जैसा कुछ मतलब है, इसलिए आप इसे केवल तभी देखेंगे जब आपको process.stdout.writeआपकी फ़ाइल के अंत में उपयोग किया गया था और आपने ब्रेक लाइन नहीं जोड़ी थी)

दूसरी ओर, console.logअधिक कर सकते हैं।

  1. आप इसे उसी तरह से इस्तेमाल कर सकते हैं

    console.log("Hello World"); //You don't need the break line here because it was already formated और यह भी कि अजीब चरित्र गायब हो गया

  2. आप एक से अधिक स्ट्रिंग लिख सकते हैं

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

  3. आप संघ बना सकते हैं

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

यह वह बात है, उस अतिरिक्त कार्यक्षमता को util.format.applyभाग के लिए धन्यवाद दिया जाता है (मैं इस बारे में बहुत बात कर सकता हूं कि यह वास्तव में क्या करता है लेकिन आपको मेरी बात समझ में आती है, आप यहां और अधिक पढ़ सकते हैं )।

मुझे आशा है कि किसी को यह जानकारी उपयोगी लगेगी।


यह बहुत मददगार होगा, अगर आपने समझाया कि कैसे उपयोग करें stdout.writeऔर प्राप्त करने से बचें%
मुहम्मद आरिफ

मैंने अपने लूप के अंत में %कॉल करके अंत में प्राप्त करने की समस्या को हल किया process.stdout.write('\n');(यदि आपके पास उदाहरण के लिए है)
मुहम्मद अरेफ

2
%सिर्फ वहाँ फ़ाइल के अंत में कोई नई पंक्ति है कह के खोल का तरीका है।
डेव न्यूटन

1
@DaveNewton आपकी बात महत्वपूर्ण है, क्योंकि इसका मतलब है कि यदि आप अपने प्रोग्राम के आउटपुट को किसी फ़ाइल में रीडायरेक्ट कर रहे हैं, उदाहरण के लिए, आपको %फ़ाइल में वह नहीं मिलेगा
mr.mams

31

एक बड़ा अंतर जिसका उल्लेख नहीं किया गया है, वह यह है कि process.stdout केवल स्ट्रिंग्स को तर्क के रूप में लेता है (इसे भी स्ट्रीम किया जा सकता है), जबकि कंसोल.लॉग किसी भी जावास्क्रिप्ट डेटा प्रकार को लेता है।

उदाहरण के लिए:

// 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)

15

इस संदर्भ में एक और महत्वपूर्ण अंतर होगा process.stdout.clearLine()और process.stdout.cursorTo(0)

यह उपयोगी होगा यदि आप केवल एक पंक्ति में डाउनलोड या प्रसंस्करण का प्रतिशत दिखाना चाहते हैं। यदि आप इसके साथ क्लियरलाइन (), कर्सरटो () का उपयोग करते हैं तो console.log()यह काम नहीं करता है क्योंकि यह टेक्स्ट में \ n भी जुड़ता है । बस इस उदाहरण की कोशिश करो:

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);

यह वही है जिसकी मुझे तलाश है। धन्यवाद।
पैट्रिक पी।

5

पोस्ट विधि के लिए https.request की मदद लेने के बाद इस पर शोध करते हुए मैंने अभी कुछ देखा है। सोचा कि मैं कुछ इनपुट को समझने में मदद करने के लिए साझा करता हूं।

process.stdout.writeजब तक console.logदूसरों ने उल्लेख किया था, तब एक नई पंक्ति नहीं जोड़ता है । लेकिन यह भी है कि उदाहरणों के साथ समझाना आसान है।

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

process.stdout.write(d);नई लाइन के बिना डेटा को ठीक से प्रिंट करेगा। हालाँकि console.log(d), एक नई लाइन प्रिंट करेगा लेकिन डेटा सही रूप से नहीं दिखाई देगा, <Buffer 12 34 56...उदाहरण के लिए।

बनाने के लिए console.log(d)जानकारी सही ढंग से दिखाने के लिए, मैं यह करने के लिए होगा।

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

तो मूल रूप से:

  • process.stdout.write डेटा को पुनर्प्राप्त किए जाने के रूप में लगातार जानकारी प्रिंट करता है और एक नई लाइन नहीं जोड़ता है।

  • console.log पुनर्प्राप्ति के बिंदु पर प्राप्त की गई जानकारी को प्रिंट करता है और एक नई लाइन जोड़ता है।

यही सबसे अच्छा तरीका है कि मैं इसे समझा सकूं।


1

सिंपल डिफरेंस है: कंसोल.लॉग () मेथड्स अपने आप नई लाइन कैरेक्टर को बढ़ाते हैं। इसका अर्थ है कि यदि हम परिणाम को पा रहे हैं और परिणाम को मुद्रित कर रहे हैं, तो प्रत्येक परिणाम नई पंक्ति में मुद्रित हो जाता है।

process.stdout.write () विधियाँ नई पंक्ति वर्ण को जोड़ती नहीं हैं। मुद्रण पैटर्न के लिए उपयोगी है।


0

Console.log कार्यान्वित करने की प्रक्रिया। sdout.write, process.sdout.write एक बफर / स्ट्रीम है जो सीधे आपके कंसोल में आउटपुट करेगा।

मेरी puglin के अनुसार serverline : console = new Console(consoleOptions)आप अपने खुद के साथ कंसोल वर्ग पुनर्लेखन कर सकते हैं ReadLine प्रणाली।

आप सांत्वना के कोड स्रोत देख सकते हैं।


और देखें :

  • अपने कस्टम व्यवहार बनाने या कंसोल इनपुट का उपयोग करने के लिए readline.createInterface
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.