首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何防止Node.js在等待回调时退出?

如何防止Node.js在等待回调时退出?
EN

Stack Overflow用户
提问于 2011-06-22 23:43:37
回答 7查看 67.1K关注 0票数 102

我的代码是这样的:

代码语言:javascript
复制
var client = new mysql.Client(options);
console.log('Icanhasclient');

client.connect(function (err) {
  console.log('jannn');
  active_db = client;
  console.log(err);
  console.log('hest');

  if (callback) {
    if (err) {
      callback(err, null);
    }

    callback(null, active_db);
  }
});

我的问题是当我运行Node时,它会立即终止。它打印'Icanhasclient',但是回调中的console.log都不会被调用。

(本例中mysql为node-mysql

有没有什么办法可以让node.js在退出前等待回调完成?

EN

回答 7

Stack Overflow用户

发布于 2014-04-29 09:40:21

您可以只使用setInterval发出setTimeout或循环超时。

如果要检查退出条件,还可以执行条件超时:

代码语言:javascript
复制
(function wait () {
   if (!SOME_EXIT_CONDITION) setTimeout(wait, 1000);
})();

将此代码放在代码的末尾,控制台将会等待……等等..。直到你想让它关闭。

票数 44
EN

Stack Overflow用户

发布于 2017-07-21 05:53:59

我的解决方案是实例化一个EventEmitter,并侦听我的自定义事件。

代码语言:javascript
复制
var eventEmitter = new process.EventEmitter();

然后我从异步回调中调用了eventEmitter.emit

代码语言:javascript
复制
client.connect(function (err) {
    eventEmitter.emit('myevent', {something: "Bla"})
});

我的脚本中的最后一件事是eventEmitter.on

代码语言:javascript
复制
eventEmitter.on('myevent', function(myResult){
  // I needed the result to be written to stdout so that the calling process could get it
  process.stdout.write(JSON.stringify(myResult));
});

节点将一直等待,直到事件处理程序完成运行。

票数 14
EN

Stack Overflow用户

发布于 2018-05-21 23:04:15

基于@Todd的回答,我创建了一个一行程序。将其包含在脚本的开头,并在完成后设置done = true

代码语言:javascript
复制
var done = (function wait () { if (!done) setTimeout(wait, 1000) })();

示例:

代码语言:javascript
复制
var done = (function wait () { if (!done) setTimeout(wait, 1000) })();

someAsyncOperation().then(() => {
  console.log('Good to go!');
  done = true;
});

它怎麽工作?如果我们稍微扩展一下:

代码语言:javascript
复制
// Initialize the variable `done` to `undefined`
// Create the function wait, which is available inside itself
// Note: `var` is hoisted but `let` is not so we need to use `var`
var done = (function wait () {

  // As long as it's nor marked as done, create a new event+queue
  if (!done) setTimeout(wait, 1000);

  // No return value; done will resolve to false (undefined)
})();
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6442676

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档