2013-03-20 2 views
4

У меня есть следующий код JavaScript:передавая анонимную функцию в качестве параметра в 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 не работает ожидается. Когда я проверяю тип обратного вызова, он предупреждает «undefined».

Как я могу исправить этот беспорядок, чтобы получить ожидаемый результат?

+0

В дополнение к заданному вопросу, взгляните на 'if (! Width || width ===" NaN ") width = 200;'. Убедитесь, что он делает то, что вы ожидаете. –

ответ

5

Похоже, вам просто нужно пройти callback через вызов в setTimeout.

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

Вы не хватает обратного вызова в другом месте

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

Это потому, что вы называете это неправильно из setTimeout():

EventsManager.animateHideLeft(); // No callback! 
3

В setTimeout вы не проходят callback к следующему вызову:

 EventsManager.animateHideLeft(); 

изменить его на

 EventsManager.animateHideLeft(callback); 

Однако неплохо было бы протестировать против typeof callback == "function", так как иногда вам не нужна/нужна функция обратного вызова, а вызов callback(); приведет к исключению.

Btw, вам не нужно указывать clearTimeout(fr); (если вы не планируете вызывать функцию несколько раз во время анимации).

Смежные вопросы