如何在解决承诺的同时保持node.js脚本活动?

时间:2015-09-15 11:54:04

标签: node.js promise

我的脚本使用promises(使用q库)执行一些异步任务。运行摩卡测试工作正常。但是,从命令行运行脚本则不行。节点进程立即死亡。

var bot = require('./bot');

bot.getCategories().then(function (categories) {
  console.log('Found ' + categories.length + ' categories');
});

3 个答案:

答案 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) })
}

在我们下面...

结尾A)-简单承诺

console.log('start')
timeoutPromise(1000)
console.log('end')

开始和结束将立即显示。 再过一秒钟,您就会看到“ howdy”并返回我们的终端提示。 (因此从某种意义上说,主脚本保持活动状态,但可能不是OP想要的...)

结尾B)-等待承诺退还

console.log('start')
return timeoutPromise(1000)
console.log('end')

开始将出现,在1秒钟后将出现“ howdy”。 “结束”是无法达到的。因此,我们在这里真正地等待着诺言,并可以兑现诺言。

结尾C)-then()

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中分层结构的某个位置……您在这里也有介绍)。