javascript - Läs en enskild rad användarinmatning med Bun.js


Bun.js har ett trevligt inbyggt API för att läsa periodisk användarinmatning:

const prompt = "Type something: ";
process.stdout.write(prompt);
for await (const line of console) {
  console.log(`You typed: ${line}`);
  process.stdout.write(prompt);
}

Men...

Jag vill läsa användarinmatningar, utanför en loop!


Jag hittade den här lösningen:

const stdinIterator = process.stdin.iterator()

console.write('What is your first name?\n> ')
const firstName = (await stdinIterator.next()).value.toString().trimEnd()
console.log('Hello,', firstName)

console.write('What is your last name?\n> ')
const lastName = (await stdinIterator.next()).value.toString().trimEnd()
console.log('Welcome', `${firstName} ${lastName}`)

Det fungerar. Men sedan avslutas inte processen automatiskt (jag måste trycka på Ctrl+C manuellt).

Svar #1

Bun.js har implementerat prompt-API:et.

Använd det och njut:

const firstName = prompt('What is your first name?')
console.log('Hello,', firstName)

const lastName = prompt('What is your last name?')
console.log('Welcome', `${firstName} ${lastName}`)

Se: https://bun.sh/docs/api/globals

Svar #2

Från en kommentar postad av aboqasem den 31-03-2024 är det möjligt att stänga iteratorn genom att anropa return()-metoden:

const iterator = console[Symbol.asyncIterator]();
const text = (await iterator.next()).value;

await iterator.return?.();

Jag har framgångsrikt använt detta i mitt projekt som kör Bun v1.1.17.

Och eftersom strömmen är stängd tillåter det processen att avslutas normalt utan att behöva ctrl+c för att avsluta den.