javascript - 在节点中挂起承诺
问题描述
我有一个 Node.js CLI 应用程序,它动态导入 chokidar(取决于传递的标志),并执行一个返回 a 的函数Promise
:
// index.ts
options.watch
? import('chokidar').then(({ default: chokidar }) =>
chokidar
.watch(options.watch)
.on('ready', async () => watchAndBuild(options))
.on('change', async () => watchAndBuild(options))
)
: watchAndBuild(options)
Promise
返回的watchAndBuild
内容如下
// watchAndBuild.ts
return new Promise(resolve => {
if (options.run) {
rl.pause()
const commandToRun = typeof options.run === 'string' ? options.run : `node ${outdir}`
const [commandName] = commandToRun.split(' ')
const commandParameters = commandToRun.split(' ').slice(1)
child = spawn(commandName, commandParameters, { stdio: 'inherit' })
child.on('close', () => {
rl.resume()
options.watch ? resolve() : process.exit()
})
} else {
console.log(
`${options.entry || options._.join(', ')} built successfully on ${options.outdir}`
)
resolve()
}
})
预计当--watch
和--run
标志都没有通过时,代码会执行它的任务,记录成功消息,解析承诺并自然退出进程(不需要process.exit()
),但是,它会挂在resolve()
,任何关于什么的线索我做错了吗?
解决方案
libuv
不知何故,这个问题与node中的一些问题有关>=14.6.0
,解决方案就像升级 node 版本一样简单,更多细节在这里
而且,我忘记关闭之前创建的readline界面,在修复它之前Promise
放一个rl.close()
权利resolve()
// watchAndBuild.ts
import readline from 'readline'
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
})
const watchAndBuild = () =>
new Promise(resolve => {
if (options.run) {
rl.pause()
const commandToRun = typeof options.run === 'string' ? options.run : `node ${outdir}`
const [commandName] = commandToRun.split(' ')
const commandParameters = commandToRun.split(' ').slice(1)
child = spawn(commandName, commandParameters, { stdio: 'inherit' })
child.on('close', () => {
rl.resume()
options.watch ? resolve() : process.exit()
})
} else {
console.log(
`${options.entry || options._.join(', ')} built successfully on ${options.outdir}`
)
rl.close() // <--- Closes the previously declared readline interface
resolve()
}
})
export default watchAndBuild
推荐阅读
- python - 如何从 Outlook 收件箱子文件夹中读取电子邮件
- sql-server - 可空列的 NULL 默认约束
- android - Chrome 检查器无法正确连接到 Cordova 应用程序
- c++ - 使用 dpbtrf 时出现分段错误
- python - 不和谐机器人没有响应
- node.js - 注销所有设备、NodeJS 和 Angular 6
- cocoa - 为什么我的 NSBox 会画背景?(boxType = .primary)
- algorithm - 如何获得装箱算法的前 N 个解决方案?
- python - 在 Pandas 中查找 groupby 之后与最大日期相关的行
- java - springSecurityFilterChain - ObjectPostProcessor 是必需的 bean 异常