4

次のJavaScriptコードがあります:

   EventsManager.prototype.hideContainer = function()
   {
     var that = this;

     var index = that.getNextUnreadEventIndex();
     if(index !== -1)
     {
         EventsManager.animateHideLeft(function() //<--- passing a function as parameter to another function
         {
             var unreadEvent = that.eventsList.splice(index,1)[0];
             unreadEvent.isEventOnFocus = true;

             that.eventsList.push(unreadEvent);
             that.displayLastEvent();
         });  
     }
   }

EventsManager.animateHideLeft() 関数のコードは次のとおりです。

EventsManager.animateHideLeft = function(callback)
{
   var p = document.getElementById("eventsContainer");
   var width = parseFloat(p.style.width);

   if(!width || width === "NaN") width = 200;

   if(width <= 10)
   {
      clearTimeout(fr);
      alert(typeof callback); //<-- this shows "undefined"
      callback();
   }
   else
   {
      width = width - 10;

      p.style.width = width + "px";

      fr = setTimeout(function()
      {
          EventsManager.animateHideLeft();
      }, 50);
  }
};

残念ながら、関数 animateHideLeft は期待どおりに機能しません。typeof コールバックをテストすると、「未定義」と警告されます。

この種の混乱を修正して、期待される結果を得るにはどうすればよいですか?

4

4 に答える 4

5

callbackの呼び出しを通過するだけでよいようですsetTimeout

fr = setTimeout(function()
{
    EventsManager.animateHideLeft(callback);
}, 50);
于 2013-03-20T20:21:12.493 に答える
3

これは、次から間違って呼び出すためですsetTimeout()

EventsManager.animateHideLeft();   // No callback!
于 2013-03-20T20:21:16.977 に答える
3

次の呼び出しに渡さsetTimeoutないでください。callback

      EventsManager.animateHideLeft();

に変更します

      EventsManager.animateHideLeft(callback);

typeof callback == "function"ただし、コールバック関数が必要ない/必要ない場合があり、callback();呼び出しによって例外が発生することがあるため、テストするのは悪い考えではありません。

ところで、必要はありませんclearTimeout(fr);(アニメーション中に関数を複数回呼び出す予定がない限り)。

于 2013-03-20T20:22:01.550 に答える
3

他の場所でコールバックがありません

 fr = setTimeout(function()
      {
          EventsManager.animateHideLeft(function(){
                ////
        });
}, 50);
于 2013-03-20T20:20:59.640 に答える