如何使用事件驱动模型"继续尝试直到它工作"?

bfo*_*ops 2 javascript recursion event-driven

我正在编写看起来像这样的代码:

function someFunction()
{
    doStuffWithCallback(function(success)
    {
        if(success)
        {
            ...
            // do stuff here
            ...
        }
        else
            someFunction();
    });
}
Run Code Online (Sandbox Code Playgroud)

基本上,继续尝试"doStuffWithCallback"直到回调接收到绿灯.通常,这将通过循环完成,但是如何在事件驱动模型中执行此操作而不会在从未达到成功的情况下导致无限递归?(success可能依赖于外部服务器之类的东西,所以如果它们失效,它将一直是假的).

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

Lig*_*ica 5

您的事件驱动模型不应如下所示:

  • 组件调度事件
  • 应用内核接收事件
  • Application内核将事件分发给已注册的处理程序
  • 注册为处理程序的组件可以调度另一个事件.在这种情况下,重复一遍.

您的事件驱动模型如下所示:

  • 组件调度事件
  • 应用内核接收事件
  • 应用程序内核队列事件
     
  • 接下来"tick",应用程序内核将所有排队的事件分发到已注册的句柄
  • 注册为处理程序的组件可以调度另一个事件.在这种情况下,重复一遍.

通过这种方式,您的事件调度机制是异步的,您根本不会有任何递归调用.

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

至少,在排队重复尝试之前,实施一个可能在每次回调失败时等待逐渐更长的间隔的后退机制.