2011-06-25 23 views
2

我写的代码看起来像这样:如何使用事件驱动模型“继续尝试,直到它工作”?

function someFunction() 
{ 
    doStuffWithCallback(function(success) 
    { 
     if(success) 
     { 
      ... 
      // do stuff here 
      ... 
     } 
     else 
      someFunction(); 
    }); 
} 

基本上,不断尝试“doStuffWithCallback”,直到回调接收了绿灯。一般来说,这将通过一个循环来完成,但是如何在事件驱动的模型中做到这一点,而不会在成功永远达不到成功的情况下导致无限递归? (success可能依赖于诸如外部服务器之类的东西,所以如果它们停止运行,它将一直是错误的)。

代码的结构不能改变太多;由于我使用的API,我必须使用回调来完成我想要的功能。

+1

它应该尝试多少次才能停止..? – amosrivera

+0

它应该继续尝试,直到用户停止。 – bfops

回答

5

你的事件驱动模型不应该这个样子的:

  • 组件调度的事件
  • 应用内核收到事件
  • 应用内核分配事件注册的处理程序
  • 注册为处理程序的组件可能会分派另一个事件。在这种情况下,重复。

你的事件驱动模型应该这个样子:

  • 组件调度的事件
  • 应用内核收到事件
  • 应用内核队列事件
     
  • 下一个“滴答“,应用程序内核将所有排队事件分配给注册句柄
  • 注册为处理程序的组件可能会分派另一个事件。在这种情况下,重复。

通过这种方式,您的事件分派机制是异步的,并且根本不会有任何递归调用。

然后,因为您仍然不希望事件被永久调度,您可能会在组件内部引入一些限制,该组件限定事件将重新分派的次数。一个简单的整数变量会做。

至少要实现一种退避机制,在排队重复尝试之前,每次回调失败时可能会等待逐渐更长的时间间隔。

+0

感谢您的出色设计修复! – bfops

+0

@RobotGymnast:没问题:) –

1

你可以引入一个计数器,并用someFunction(1000)来调用它来尝试1000次。

function someFunction(countDown) 
{ 
    doStuffWithCallback(function(success) 
    { 
     if(success) 
     { 
      ... 
      // do stuff here 
      ... 
     } 
     else if(countDown > 0) 
      someFunction(countDown - 1); 
    }); 
} 
+1

这看起来很不错,假设'doStuffWithCallback'是一些异步方法,稍后会调用回调函数 – nicolaskruchten

相关问题