2017-01-04 2 views
0

Ich versuche ein Programm in Nodejs zu machen, das auf Benutzereingaben warten kann, während man andere Dinge auf dem Bildschirm druckt, ohne alles durcheinander zu bringen.Handhabung von nodejs Eingabe während der Ausgabe

Verwendung des folgenden Codes:

setInterval(function(){ 
     console.log("just displaying some stuff"); 
},1000); 
process.stdin.on("data", function(char) { 
    console.log(char); 
}); 

ich folgendes Ergebnis:

just displaying some stuff 
just displaying some stuff 
'this is' just displaying some stuff 
'in'just displaying some stuff 
'put'just displaying some stuff 

Das Ergebnis ich suchte ist so etwas wie:

just displaying some stuff 
just displaying some stuff 
just displaying some stuff 
just displaying some stuff 
just displaying some stuff 
'this is input' 

Irgendwelche Ideen? Ich konnte nichts fast Hilfreiches finden.

+0

Sie senden die Eingabe von stdin sofort an die Konsole. Was hast du sonst noch erwartet? – Flimzy

Antwort

1

Sie können etwas mit ncurses oder einer anderen textbasierten UI-Bibliothek tun. In Node gibt es ein exzellentes Modul namens blessed, das dir bei solchen Dingen helfen kann. Siehe:

Es einige schöne Demos hat mit noch komplizierter Anwendungsfälle:

In Ihrem Fall können Sie ein Fenster machen, die den gesamten Bildschirm minus nimmt eine Zeile und drucken Sie Ihren Text dort, während Sie im zweiten Fenster darunter eine Eingabe erhalten, die bei Bedarf eine Zeile hoch oder höher sein kann.

Es wird komplizierter sein als eine einfache console.log() zu setzen, aber es ist sicherlich möglich und hören Sie nicht auf Leute, die Ihnen sagen, dass es nicht ist.

+0

Genau das, was ich brauchte, danke! – Globala

1

Wie rsp sagte, gesegnet ist ein großes Werkzeug für diesen Kandidaten. Hier ist eine Beispielimplementierung, die Sie verwenden können.

Ich habe gesegnet, um eine Textbox in der unteren Zeile auf dem Bildschirm zu erstellen. Der Rest des Bildschirms ist der "Körper", in dem Ihre Code-Ausgabe hinzugefügt wird. Auf diese Weise wird Ihr Programm bei der Eingabe keinen Einfluss auf die Ausgabe haben, wie Sie es erlebt haben.

Um dies zu versuchen, führen npm install blessed --save, dann diesen Code in Knoten ausgeführt:

const blessed = require('blessed'); 

var screen = blessed.screen(); 
var body = blessed.box({ 
    top: 0, 
    left: 0, 
    height: '100%-1', 
    width: '100%', 
    keys: true, 
    mouse: true, 
    alwaysScroll: true, 
    scrollable: true, 
    scrollbar: { 
    ch: ' ', 
    bg: 'red' 
    } 
}); 
var inputBar = blessed.textbox({ 
    bottom: 0, 
    left: 0, 
    height: 1, 
    width: '100%', 
    keys: true, 
    mouse: true, 
    inputOnFocus: true, 
    style: { 
    fg: 'white', 
    bg: 'blue' // Blue background so you see this is different from body 
    } 
}); 

// Add body to blessed screen 
screen.append(body); 
screen.append(inputBar); 

// Close the example on Escape, Q, or Ctrl+C 
screen.key(['escape', 'q', 'C-c'], (ch, key) => (process.exit(0))); 

// Handle submitting data 
inputBar.on('submit', (text) => { 
    log(text); 
    inputBar.clearValue(); 
}); 

// Add text to body (replacement for console.log) 
function log(text) { 
    body.pushLine(text); 
    screen.render(); 
} 


/* 
* Demonstration purposes 
*/ 

// Listen for enter key and focus input then 
screen.key('enter', (ch, key) => { 
    inputBar.focus(); 
}); 

// Log example output 
setInterval(() => { 
    log("just displaying some stuff"); 
}, 1000); 

Wichtige Punkte sind hier:

  • Ihr Code-Ausgabe mit der log Funktion zeigen. Betrachten Sie dies als console.log Drop-in-Ersatz. Benutze keine console.* Funktionen mehr, sie werden den Bildschirm von gesegnet machen.
  • Sie müssen das Element inputBar "fokussieren", damit es Eingaben empfängt. Sie können sie jedoch immer fokussieren lassen, aber meine Demonstration zeigt, dass Sie auf eine Enter-Taste drücken oder auf die blaue Leiste klicken, um sie zu fokussieren. Wenn Sie Code schreiben, der den Bildschirm manipuliert, denken Sie daran, screen.render() auszuführen, um Ihre Änderungen zu rendern.