4

私が考えたことを持っていることは、大きな痛みであることに対処するのに比較的簡単な問題であるべきです...私はやろうとしています:

a.b("param", function(data)
{
     logger.debug("a.b(" + data.toString() + ")");

     if (data.err == 0)
     {
           // No error, do stuff with data
     }
     else
     {
           // Error :(  Redo the entire thing.
     }
});

これに対する私のアプローチは、次のことを試みることでした。

var theWholeThing = function() {return a.b("param", function(data)
{
     logger.debug("a.b(" + data.toString() + ")");

     if (data.err == 0)
     {
           // No error, do stuff with data
     }
     else
     {
           // Error :(  Redo the entire thing.
           theWholeThing();
     }
})};

上記の問題は、前者が機能している間(エラーが発生したときに処理しなかったことを除く)、後者はログメッセージを出力しないことです...「theWholeThing()」呼び出しが思ったように機能していないかのように(もう一度全部を呼び出します)。

ここに微妙に何かが間違っているに違いありません、何かヒントはありますか?

ありがとう!

4

2 に答える 2

5

まず、質問に直接答えるために、最初に実際に関数を呼び出すのを忘れたようです。試す:

var theWholeThing = function() {return a.b("param", function(data)
{
     logger.debug("a.b(" + data.toString() + ")");

     if (data.err == 0)
     {
           // No error, do stuff with data
     }
     else
     {
           // Error :(  Redo the entire thing.
           theWholeThing();
     }
})};

theWholeThing(); // <--- Get it started.

ただし、これは、名前付き IIFE (即時に呼び出される関数式) でもう少しエレガントに実現できます。

// We wrap it in parentheses to make it a function expression rather than
// a function declaration.
(function theWholeThing() {
    a.b("param", function(data)
    {
         logger.debug("a.b(" + data.toString() + ")");

         if (data.err == 0)
         {
               // No error, do stuff with data
         }
         else
         {
               // Error :(  Redo the entire thing.
               theWholeThing();
         }
    });
})(); // <--- Invoke this function immediately.
于 2012-12-03T05:34:42.107 に答える
0

メソッドを分離し、変数を使用して表現すると、物事が明確になります。ab と無名関数をメソッド参照として扱うだけです。このコードサンプルが役立つと思います:

var theWholeThing = a.b, //this is a reference of b method
    par = "param",
    callback = function(data){
     logger.debug("a.b(" + data.toString() + ")");

     if (data.err == 0)
     {
           console.log("no error");    
     }
     else
     {
           console.log("Error");
           // theWholeThing reference can be accessed here and you can pass your parameters along with the callback function using variable name 
           theWholeThing("param", callback); 
     }
}; //declare the callback function and store it in a variable

theWholeThing("param", callback); //invoke it

</p>

于 2012-12-03T05:49:59.590 に答える