【问题标题】:Exiting in node.js after recursive function is done递归函数完成后退出 node.js
【发布时间】:2012-10-27 10:27:31
【问题描述】:

我尝试重新连接我的大脑以进行异步编码,但我仍然似乎失败了。不幸的是,在这种情况下,我无法弄清楚如何正确地做到这一点。举个例子吧:

var nconf = require('nconf');

 nconf.argv()
 .env();

 function runme(callback){
   var nummessages = nconf.get('SMS_MESSAGES');
   decodemessage(0, nummessages);
   callback();
 }

 function decodemessage(i, nummessages) {
  if( i < nummessages ) {
    var message = 'SMS_'+(i+1)+'_TEXT';
    var number = 'SMS_'+(i+1)+'_NUMBER';
    console.log('number: '+number);
    console.log('message: '+message);
    console.log('message text: '+ nconf.get(message));
    console.log('message number: '+ nconf.get(number));
    decodemessage(i+1);
  }
} 

runme(function(){
  process.exit(0);
});

这由 gammu-smsd 调用,它接收 SMS 消息并将它们放入 ENV vars 并启动脚本。只要我自己运行它就可以正常工作,返回代码似乎也可以。当我从 gammu-smsd 运行它时,它失败了,看起来 decodemessage 从未执行过。一些调试输出显示我确实进入了 runme()。

我的猜测是 runme() 中的回调在递归 decodemessage() 调用完成之前执行。我是对的吗?如果是这样,有人可以解释我如何正确地做到这一点吗?

如果你想这样测试运行它:

node server.js --SMS_MESSAGES 2 --SMS_1_TEXT blabliblo --SMS_1_NUMBER=47796546546 --SMS_2_TEXT Iammessagetwo --SMS_2_NUMBER 12345678

谢谢

【问题讨论】:

  • 不,如果递归 decodemessage 是同步的,则不会。实际上,需要使用回调的异步部分在哪里?
  • 我不确定我是否理解正确,我想通过回调保证的是,当一切都完成并且递归返回时,我的脚本以 0 存在。
  • Javascript 执行是单线程的。所以如果你没有任何异步的东西,你应该只使用一个普通的for循环并将process.exit(0)语句放在它后面。如果您有异步的东西,请向我们展示(您的示例代码中没有)!
  • 好的,我明白你的意思了。我现在做了一个 for-loop 版本,虽然它在测试中有效,但它不是来自 gammu-sms,它再次没有进入循环。所以我有一些奇怪的问题我必须弄清楚,会报告回来。我稍后会通过请求发布数据,所以这将是异步的。

标签: javascript node.js asynchronous recursion callback


【解决方案1】:

似乎您忘记在递归调用中传递nummessages

decodemessage(i+1, nummessages);

这就是为什么我个人在使用递归时大多是向后循环(到零)。

【讨论】:

  • Tnx 没错,在这之前我有一个闭包,这就是我忘记添加它的原因。但是,这似乎并不能解决问题,当我从 gammu-smsd 启动它时,它仍然没有进入 decodemessage。
  • 我关闭了这个,我很确定 gammu-smsd 做错了什么并且代码是正确的。感谢您的提示。
猜你喜欢
  • 2017-06-28
  • 1970-01-01
  • 2021-11-11
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多