2014-10-25 3 views
1

Мне не удается получить доступ к методу вложенного класса. Это то, что я пробовал до сих пор. Основная проблема заключается в вызове TimerTask.execute(). Ошибка указывает, что задача не определена.Проблема выделения для вложенного класса

Uncaught TypeError: undefined is not a function

Программа должна отображать приращение для десяти прогонов по таймеру.

var TimerTask = new Class({ 
 
    initalize: function (options) { 
 
    this.counter = options.counter; 
 
    this.run = options.run; 
 
    this.onComplete = options.complete; 
 
    this.done = false; 
 
    }, 
 
    execute : function() { 
 
    var me = this; 
 
    this.counter--; 
 
    if (this.done === false || this.counter <= 0) { 
 
     this.done = true; 
 
     me.onComplete.call(me); 
 
    } else { 
 
     me.run.call(me); 
 
    } 
 
    } 
 
}); 
 

 
var Timer = new Class({ 
 
    initialize: function (options) { 
 
    this.id = 0; 
 
    this.running = true; 
 
    this.count = 0; 
 
    this.delay = options.delay || 1000; 
 
    this.tasks = options.tasks || []; 
 
    }, 
 
    start: function() { 
 
    var me = this; 
 
    me.id = setInterval(function tick() { 
 
     if (!me.running) return; 
 
     for (var i = 0; i < me.tasks.length; i++) { 
 
     me.tasks[i].execute(); 
 
     } 
 
     me.count++; 
 
    }, this.delay); 
 
    }, 
 
    pause: function pause() { 
 
    this.running = false; 
 
    return this; 
 
    }, 
 
    run: function run() { 
 
    this.running = true; 
 
    return this; 
 
    }, 
 
    stop: function stop() { 
 
    clearInterval(this.id); 
 
    this.stopped = true; 
 
    return this; 
 
    }, 
 
    schedule: function (task) { 
 
    this.tasks.push(task); 
 
    } 
 
}); 
 

 
var i = 0; 
 
var t1 = new Timer({ 
 
    delay: 1000, 
 
    tasks: [ 
 
    new TimerTask({ 
 
     run: function() { 
 
     document.getElementById('output').innerHTML = parseInt(i++, 10); 
 
     }, 
 
     onComplete: function() { 
 
     alert('DONE!'); 
 
     }, 
 
     counter: 10 
 
    })] 
 
}); 
 

 
t1.start();
<script src="//cdnjs.cloudflare.com/ajax/libs/mootools/1.5.0/mootools-core-full-compat.min.js"></script> 
 
<div id="output"></div>

+0

где же me.call получить определенный? – dandavis

+0

теперь нет options.complete defined, и не инициализируется когда-либо называемый ... – dandavis

+0

@ dandavis Хорошая ловушка, но проблема в 'run'. И я знаю, что это определено. Просто установите точку останова в 'else me.run.call (me);' в 'TimerTask.execute()'; функция не является частью прототипа этого объекта ... –

ответ

1

О, ничего себе. Не могу поверить, что никто не нашел опечатку в TimerTask. Неудивительно, что я продолжал получать прототип вместо экземпляра. Я записал «инициализировать» без 3-го «i» ...

В любом случае, я исправил проблему, и код славный.

Примечание: Я использовал это в качестве основы для моего таймера - https://gist.github.com/NV/363465

var TimerTask = new Class({ 
 
    initialize: function (options) { 
 
     this.counter = options.counter || 0; 
 
     this.run = options.run; 
 
     this.onComplete = options.onComplete; 
 
     this.active = true; 
 
     this.isInfinite = this.counter === 0; 
 
    }, 
 
    execute: function() { 
 
     if (!this.isInfinite && this.counter === 0) { 
 
      this.active = false; 
 
      if (this.onComplete !== undefined) { 
 
       this.onComplete(); 
 
      }    
 
     } else { 
 
      this.run(); 
 
      if (!this.isInfinite) { 
 
       this.counter--; 
 
      } 
 
     } 
 
    }, 
 
    isActive: function() { 
 
     return this.active; 
 
    } 
 
}); 
 

 
var Timer = new Class({ 
 
    initialize: function (options) { 
 
     this.id = 0; 
 
     this.running = true; 
 
     this.count = 0; 
 
     this.delay = options.delay || 1000; 
 
     this.tasks = options.tasks || []; 
 
     Timer.all.push(this); 
 
    }, 
 
    start: function() { 
 
     var me = this; 
 
     me.id = setInterval(function tick() { 
 
      if (!me.running) return; 
 
      for (var i = 0; i < me.tasks.length; i++) { 
 
       var task = me.tasks[i]; 
 
       if (task.isActive()) { 
 
        task.execute(); 
 
       } else { 
 
        console.log('Task is complete...'); 
 
       } 
 
      } 
 
      me.count++; 
 
     }, this.delay); 
 
    }, 
 
    pause: function pause() { 
 
     this.running = false; 
 
     return this; 
 
    }, 
 
    run: function run() { 
 
     this.running = true; 
 
     return this; 
 
    }, 
 
    stop: function stop() { 
 
     clearInterval(this.id); 
 
     this.stopped = true; 
 
     return this; 
 
    }, 
 
    schedule: function (task) { 
 
     this.tasks.push(task); 
 
    } 
 
}); 
 

 
Timer.extend({ 
 
    all : [], 
 
    pause : function pause() { 
 
     var all = Timer.all; 
 
     for (var i = 0; i < all.length; i++) { 
 
      all[i].pause(); 
 
     } 
 
     return all; 
 
    }, 
 
    run : function run() { 
 
     var all = Timer.all; 
 
     for (var i = 0; i < all.length; i++) { 
 
      all[i].run(); 
 
     } 
 
     return all; 
 
    }, 
 
    stop : function stop() { 
 
     var all = Timer.all; 
 
     for (var i = 0; i < all.length; i++) { 
 
      all[i].stop(); 
 
     } 
 
     return all; 
 
    } 
 
}); 
 

 
function print(id, value) { 
 
    document.getElementById(id).innerHTML = value; 
 
} 
 

 
var i = 0; 
 
var t1 = new Timer({ 
 
    delay: 100, 
 
    tasks: [ 
 
    new TimerTask({ 
 
     run: function() { 
 
      print('output1', String.fromCharCode(65 + i)); 
 
     }, 
 
     onComplete: function() { 
 
      console.log('Task 1 complete...'); 
 
     }, 
 
     counter: 26 
 
    }), 
 
    new TimerTask({ 
 
     run: function() { 
 
      print('output2', parseInt(i++, 10)); 
 
     } 
 
    })] 
 
}); 
 

 
t1.start(); 
 

 
// After 4 seconds, stop all timers. 
 
setTimeout(function() { 
 
    Timer.stop(); 
 
}, 4000);
<script src="//cdnjs.cloudflare.com/ajax/libs/mootools/1.5.0/mootools-core-full-compat.min.js"></script> 
 
<div id="output1"></div> 
 
<div id="output2"></div>

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