Javascript 如何";继续尝试,直到成功。”;使用事件驱动模型?

Javascript 如何";继续尝试,直到成功。”;使用事件驱动模型?,javascript,recursion,event-driven,Javascript,Recursion,Event Driven,我正在编写如下代码: function someFunction() { doStuffWithCallback(function(success) { if(success) { ... // do stuff here ... } else someFunction(); }); } 基本上,继续尝试“doS

我正在编写如下代码:

function someFunction()
{
    doStuffWithCallback(function(success)
    {
        if(success)
        {
            ...
            // do stuff here
            ...
        }
        else
            someFunction();
    });
}
基本上,继续尝试“doStuffWithCallback”,直到回调收到绿灯。一般来说,这将通过循环来完成,但是我如何使用事件驱动模型来完成这项工作,而不会在从未成功的情况下导致无限递归?(
success
可能依赖于外部服务器之类的东西,因此如果它们停机,它将继续为false)


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

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

function someFunction(countDown)
{
    doStuffWithCallback(function(success)
    {
        if(success)
        {
            ...
            // do stuff here
            ...
        }
        else if(countDown > 0)
            someFunction(countDown - 1);
    });
}
您的事件驱动模型不应如下所示:

function someFunction()
{
    doStuffWithCallback(function(success)
    {
        if(success)
        {
            ...
            // do stuff here
            ...
        }
        else
            someFunction();
    });
}
  • 组件分派一个事件
  • 应用程序内核接收事件
  • 应用程序内核将事件分发给已注册的处理程序
  • 注册为处理程序的组件可以调度另一个事件。在这种情况下,请重复
您的事件驱动模型应该如下所示:

function someFunction()
{
    doStuffWithCallback(function(success)
    {
        if(success)
        {
            ...
            // do stuff here
            ...
        }
        else
            someFunction();
    });
}
  • 组件分派一个事件
  • 应用程序内核接收事件
  • 应用程序内核队列事件
  • 下一个“滴答声”,应用程序内核将所有排队事件分发给已注册的句柄
  • 注册为处理程序的组件可以调度另一个事件。在这种情况下,请重复
这样,您的事件分派机制是异步的,并且根本不会有任何递归调用

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


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

它应该尝试多少次才能停止..?它应该继续尝试,直到用户停止为止。这看起来是一种很好的方法,假设
doStuffWithCallback
是某个异步方法,稍后将调用回调