Bun.js中循环外读取单行用户输入及进程终止问题
在Bun.js循环外读取用户输入并解决进程无法终止问题
Bun.js有原生API支持循环读取用户输入,示例代码如下:
const prompt = "Type something: "; process.stdout.write(prompt); for await (const line of console) { console.log(`You typed: ${line}`); process.stdout.write(prompt); }
但如果需要在循环外单次读取用户输入,可以通过process.stdin.iterator()实现:
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}`)
不过这段代码会导致进程无法自动终止,必须手动按下Ctrl+C结束。原因是stdin迭代器会保持事件循环处于活跃状态,阻止进程退出。
要解决这个问题,只需在读取完所有输入后,关闭stdin流或者直接终止进程:
方法1:关闭stdin流
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}`) // 关闭stdin,允许进程自动终止 process.stdin.end()
方法2:直接终止进程
如果不需要等待其他异步任务执行,也可以直接调用process.exit():
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}`) // 直接终止进程 process.exit(0)
内容的提问来源于stack exchange,提问作者Mir-Ismaili
相关产品推荐
相关产品推荐

