繁体   English   中英

如何使用事件驱动的模型“继续尝试直到可行”?

[英]How to “keep trying until it works” with an event-driven model?

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

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

基本上,继续尝试“ doStuffWithCallback”,直到回调收到绿灯为止。 通常,这将通过循环来完成,但是在从未达到成功的情况下,如何使用事件驱动的模型执行此操作而又不会引起无限递归? success可能取决于外部服务器之类的东西,因此,如果它们出现故障,它将一直是错误的)。

代码的结构不能太多更改。 由于要使用的API,我必须使用回调来完成所需的操作。

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

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

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

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

这样,您的事件分配机制是异步的,并且根本不会进行任何递归调用。

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

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

您可以引入一个计数器,并使用someFunction(1000)进行调用以尝试1000次。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM