2

我正在编写如下所示的代码:

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

基本上,继续尝试“doStuffWithCallback”,直到回调收到绿灯。通常,这将通过一个循环来完成,但是如果从未达到成功,我如何使用事件驱动模型来做到这一点而不会导致无限递归?(success可能依赖于外部服务器之类的东西,所以如果它们出现故障,它将一直是错误的)。

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

4

2 回答 2

4

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

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

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

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

这样,你的事件调度机制是异步的,你根本不会有任何递归调用。

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

至少,实现一种退避机制,每次回调失败时,该机制可能会等待越来越长的时间间隔,然后再将重复尝试排队。

于 2011-06-25T23:08:03.800 回答
1

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

function someFunction(countDown)
{
    doStuffWithCallback(function(success)
    {
        if(success)
        {
            ...
            // do stuff here
            ...
        }
        else if(countDown > 0)
            someFunction(countDown - 1);
    });
}
于 2011-06-25T23:04:48.783 回答