我的脚本使用promises(使用q库)执行一些异步任务。运行摩卡测试工作正常。但是,从命令行运行脚本则不行。节点进程立即死亡。
var bot = require('./bot');
bot.getCategories().then(function (categories) {
console.log('Found ' + categories.length + ' categories');
});
答案 0 :(得分:9)
当没有更多要回复的回调时,Node.js将退出。您可以使用setInterval或setTimeout始终保留一个,以便进程不会自动退出。
function wait () {
if (!EXITCONDITION)
setTimeout(wait, 1000);
};
wait();
答案 1 :(得分:8)
我的脚本使用promises(使用q库)执行一些异步任务。运行摩卡测试工作正常。但是,从命令行运行脚本则不行。节点进程立即死亡。
这肯定是一个错误,请报告。在事件循环中仍然排队的事物中,Node.js环境不应过早退出。
为了实现这一点,你不应该改变你的代码。 Q库(请记住,今天有更多的现代和本地替代方案)在process.nextTick
" microtask"上安排异步回调。队列。您的机器人库可能也会执行IO,这些都会导致节点无法终止。
答案 2 :(得分:1)
让我们这样开始:
'use strict'
const timeoutPromise = (time) => {
return new Promise((resolve, reject) => { setTimeout(() =>
{ console.log('howdy'); resolve('done') }, time) })
}
在我们下面...
console.log('start')
timeoutPromise(1000)
console.log('end')
开始和结束将立即显示。 再过一秒钟,您就会看到“ howdy”并返回我们的终端提示。 (因此从某种意义上说,主脚本保持活动状态,但可能不是OP想要的...)
console.log('start')
return timeoutPromise(1000)
console.log('end')
开始将出现,在1秒钟后将出现“ howdy”。 “结束”是无法达到的。因此,我们在这里真正地等待着诺言,并可以兑现诺言。
console.log('start')
return timeoutPromise(1000).then((result) => {
console.log('end', result)
process.exit(123) // usually 0 for 'ok', just demo!
}
)
开始将出现,一秒钟过去,并且出现“ howdy”,“ end”和“ done”。并且可以用来send a return value。
$>node haveMainWait.js
start
howdy
end done
$>echo $? // return value of last command
123
几乎可以肯定,您要在.then()
之后加上.catch()
,以防应许被拒绝...(并且仅在这种情况下返回非零退出代码)
您当然可以使用Promise.all(…)
或async / await-Function(而不是像timeoutPromises(…)
这样的Promise)(必须将其包装回Promise中分层结构的某个位置……您在这里也有介绍)。