簡體   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