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

Pausing the nodejs function for a response from other function

本文关键字:函数 响应 其他 nodejs 暂停 获取      更新时间:2023-09-26

我正在使用亚马逊提供的Node.JS库来管理EC2和Autoclaing组。我写了一个程序来删除一个实例,这样自动缩放组就会创建一个新的实例。但在删除任何其他实例之前,我需要确保新实例由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

您在这里描述的问题是一个"轮询",虽然在节点的异步编程模型中谈论"暂停"通常是一种反模式,但轮询可能是它具有有效应用程序的一种情况。

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

这里有一些不同的方法可以解决你的问题。

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/]和亚马逊弹性豆茎[http://aws.amazon.com/elasticbeanstalk/]。你可能也有一些运气。

快乐节点黑客攻击:)

nodejs实际上并没有暂停。您可能正在寻找类似eventEmitter的东西,因此可以在发出事件时调用函数。http://nodejs.org/api/events.html

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

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

以下是节点级别上的一些示例代码https://github.com/rvagg/node-levelup/blob/master/test/benchmarks/index.js#L60-L84