暂停nodejs函数以获取来自其他函数的响应

时间:2013-07-22 23:50:53

标签: javascript node.js amazon-web-services callback while-loop

我正在使用亚马逊提供的Node.JS库来管理EC2和Autosclaing组。我编写了一个删除实例的程序,以便autscaling组创建一个新实例。但在删除任何其他实例之前,我需要确保新的实例是由amazon生成的并且正在运行。为此我需要暂停我的程序并继续检查,直到我得到积极的回应。这就是它的工作原理---

(我通常有3-4个实例,必须替换3-4个新类型的实例。)

所以我的节目是 -

 updateServer(){
      Which has the code to retrieve the instances from the server.
      foreach(instance in the list of instances){
           replace(); (with new one.)
      }
 }

replace() {
   delete the old one.
   while(new instance is not generated) {
      check();
   }
}

check(){
  return the status.
}

现在问题是我需要按顺序发生这种情况。我该如何暂停程序? 因为在我的情况下,foreach循环执行并且程序结束并且它不进入该检查循环。你能不能给我一些想法。

由于

链接 - http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/frames.html

3 个答案:

答案 0 :(得分:1)

你在这里描述的问题是一个'轮询',而谈论'暂停'通常是节点的异步编程模型中的反模式,轮询可能是它有一种情况有效的申请。

但是出于代码可维护性的原因 - 在这种情况下能够稍后添加其他任务(例如其他检查),您还应该异步处理轮询。

以下是一些可以解决您问题的不同方法。

<强> 1 即可。不要在 node.js 中处理问题 - 从主机的 crontab 调用节点应用程序并设计程序退出。这不是节点,但它肯定是强大的解决方案。

2. 使用npm安装节点计时器模块[https://github.com/markussieber/timer]。使用timer会将check()函数作为参数传递,因此它会定期调用它。这更滑,但可以扩展,因为你可以运行大量的检查,这对于可扩展的EC2部署来说可能就是这样。

timer = require('timer');   //import the time module    
function check(){           //check function now polls
    //add an if(something==true) statement here to allow you to exit if necessary
    console.log("Checking stuff");
    timer.timer(200, check); //calls this function repeatedly every 200ms
}

check(); //starts the code polling

3。话虽如此,您尝试实现的功能对我而言听起来与Amazon Autoscaling提供的功能相同[http://aws.amazon.com/autoscaling/ ]和Amazon Elastic Beanstalk [http://aws.amazon.com/elasticbeanstalk/]。你可能也有运气。

快乐节点黑客攻击:)

答案 1 :(得分:0)

实际上,

nodejs没有暂停。你可能正在寻找像eventEmitter这样的东西,所以你可以在发出事件时调用一个函数。 http://nodejs.org/api/events.html

答案 2 :(得分:0)

你永远不应该在节点中暂停。看看async(https://github.com/caolan/async)。您需要的可能是async.forEachSeries(),它允许您以串行方式执行操作,但是不同步。

在你的情况下,它将启动一个服务器,当它启动时,会调用一个回调,使系列继续在下一个服务器上等。

以下是node-levelup https://github.com/rvagg/node-levelup/blob/master/test/benchmarks/index.js#L60-L84

的一些示例代码