2

次のようなコードを書いています。

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

基本的には、コールバックが青信号を受け取るまで「doStuffWithCallback」を試行し続けます。通常、これはループで実行されますが、成功に到達しないイベントで無限再帰を引き起こすことなく、イベント駆動型モデルでこれを行うにはどうすればよいでしょうか? (success外部サーバーなどに依存している可能性があるため、それらがダウンしている場合、常にfalseになります)。

コードの構造はあまり変更できません。使用している API のために、コールバックを使用して目的を達成する必要があります。

4

2 に答える 2

4

イベント ドリブン モデルは次のようになってはいけません。

  • コンポーネントがイベントをディスパッチします
  • アプリケーション カーネルがイベントを受け取る
  • アプリケーション カーネルは、イベントを登録済みのハンドラに配布します
  • ハンドラーとして登録されたコンポーネントは、別のイベントを送出する場合があります。その場合、繰り返します。

イベント ドリブン モデル次のようになります。

  • コンポーネントがイベントをディスパッチします
  • アプリケーション カーネルがイベントを受け取る
  • アプリケーション カーネル キュー イベント
     
  • 次の「ティック」では、アプリケーション カーネルがキューに入れられたすべてのイベントを登録済みのハンドルに配布します。
  • ハンドラーとして登録されたコンポーネントは、別のイベントを送出する場合があります。その場合、繰り返します。

このように、イベント ディスパッチ メカニズムは非同期であり、再帰呼び出しはまったくありません。

次に、イベントが永遠にディスパッチされることを望まないため、イベントが再ディスパッチされる回数を定義するコンポーネント内部の制限を導入することがあります。単純な整数変数で十分です。

少なくとも、繰り返し試行をキューに入れる前に、コールバックが失敗するたびに徐々に長い間隔で待機する可能性があるバックオフ メカニズムを実装します。

于 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 に答える