2017-09-10 3 views
0

Ich habe diese einfache Funktion, die eine gewünschte Zeichenfolge an den Anfang jeder Zeile voranstellen wird. Ich habe dies mit Streams arbeiten, aber in einigen Fällen ist es auch bequem mit einem console.log() Typ des Konstrukts. HierKann Code nicht korrekt vorangestellt werden

ist die Funktion:

// nimmt einen String vorangestellt wird, und ein Strom vorangestellt zu:

exports.lp = function (str, strm) { 
    return function prependLog() { 
     var args = Array.from(arguments); 
     var hasNonWhitespace = args.some(function (a) { 
      var str = String(a); 
      return str.length > 0 && /\S/g.test(str); 
     }); 
     if (hasNonWhitespace) { 
      strm.write(str); 
     } 
     args.forEach(function (s, i) { 
      String(s).split('\n').forEach(function (s, i) { 
       if (i < 1) { 
        strm.write(s + ' '); 
       } 
       else { 
        strm.write('\n' + str + s); 
       } 
      }); 
     }); 
     strm.write('\n'); 
    }; 
}; 

Hier ist die Verwendung:

const {lp} = require('log-prepend'); 
const fn = lp(' [foobar] ', process.stdout); 


fn('\n'); 
fn(); 
fn(); 
fn('','',''); 
fn('log1', 'log2\n3',4,5 + '\n55'); 
fn('a','b','c'); 

und hier ist die Ausgabe von oben:

[foobar] 



[foobar] log1 log2 
[foobar] 34 5 
[foobar] 55 
[foobar] a b c 

das Problem ist, dass für leere Zeilen mit nicht-Leerzeichen, es funktioniert normalerweise, aber wenn ich ein Newline-Zeichen, es gibt [Foobar] obwohl es nichts in dieser Zeile ist.

Ich kann nicht herausfinden, warum meine Funktion [foobar] nicht für Zeilen mit nicht-whitespace weglassen. Also, um genau zu sein, ist es die erste Instanz von [foobar] darüber, die mich mystifiziert.

Antwort

1

Haben Sie ein wenig Schwierigkeiten, die Logik hier zu folgen, aber ist es, weil Sie erwarten, die Indexvariable von der ersten forEach Funktion zu verwenden, wenn sie es tatsächlich von der Sekunde verwendet? Das Umbenennen der Anfangsvariablen könnte helfen.

+0

Ich machte eine Reparatur, es funktioniert jetzt wie erwartet. Ich suche immer noch nach einer effizienteren oder robusteren Art, es zu programmieren. –

+0

Sie können es selbst testen, um zu sehen, ob es sich genau wie 'console.log()' oder 'console.error()' verhält, aber mit der gegebenen vorangestellten Zeichenfolge in jeder Zeile. –

0

Ich glaube, ich eine gute fix wie so gemacht:

exports.lp = function (str, strm) { 
    return function prependLog() { 
     var args = Array.from(arguments); 
     var hasNonWhitespace = args.some(function (a) { 
      var str = String(a); 
      return str.length > 0 && /\S/g.test(str); 
     }); 
     if (hasNonWhitespace) { 
      strm.write(str); 
     } 
     args.forEach(function (s, i) { 
      String(s).split('\n').forEach(function (s, i) { 
       if (i < 1) { 
        strm.write(s + ' '); 
       } 
       else { 

        // => here is the fix, add the following if/else 

       if (/\S/g.test(s)) { 
        strm.write('\n' + str + s); 
       } 
       else { 
        strm.write('\n' + s); 
       } 
       } 
      }); 
     }); 
     strm.write('\n'); 
    }; 
}; 

aber wenn jemand einen besseren Weg, dies zu tun, lass es mich wissen.

Verwandte Themen