2010-03-17 3 views
2

Я использую приведенный ниже код для написания кода для запроса веб-метода за указанный интервал.

сейчас в this.Poll функции я должен сделатьКак получить имя экземпляра объекта

this.tmo = setTimeout(this.strInstanceName + ".Poll()", this.iInterval); 

вместо

this.tmo = setTimeout(this.Poll(), this.iInterval); 

потому, что IE теряет этот указатель после SetTimeout
Так что я должен пройти это класс имя экземпляра:

var objPoll = new cPoll("objPoll"); 


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

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" > 
<head> 
    <title>Intervall-Test</title> 
    <script type="text/javascript" language="javascript"> 


     function test() 
     { 
      alert("Test"); 
      test.tmo = setTimeout(test, 2000); 

      test.Clear = function() 
      { 
       clearTimeout(test.tmo); 
      } 
     } 




     function cPoll(strInstanceName) 
     { 
      this.strInstanceName = strInstanceName ; 
      this.iInterval = 2000; 
      this.tmo=null; 
      this.cbFunction=null; 

      this.Poll = function() 
      { 
       this.cbFunction(); 
       this.tmo = setTimeout(this.strInstanceName + ".Poll()", this.iInterval); 
      } 

      this.Start = function(pCallBackFunction, iIntervalParameter) 
      { 


       if(this.tmo != null) 
        this.Stop(); 

       if(iIntervalParameter && iIntervalParameter > 0) 
        this.iInterval=iIntervalParameter; 

       this.cbFunction=pCallBackFunction; 
       if(this.cbFunction!=null) 
        this.Poll(); 
       else 
        alert("Invalid or no callback function specified"); 
      } 

      this.Stop = function() 
      { 
       if(this.tmo != null) 
       { 
        clearTimeout(this.tmo); 
        this.tmo=null; 
       } 
      } 
     } 


     function CallBackFunction() 
     { 
      alert("PollCallBack"); 
     } 

     // test(); 
     // test.Clear(); 


     var objPoll = new cPoll("objPoll"); 
    </script> 
</head> 

<body> 
<h1>Test</h1> 

<input type="Button" value="Start polling" onclick="objPoll.Start(CallBackFunction,3000);" /> 
<input type="Button" value="Stop polling" onclick="objPoll.Stop();" /> 
</body> 
</html> 

ответ

2

Сыпучие скобка в this.Poll(). Вы вызываете эту функцию сразу, а не через промежуток времени. Если вы потеряете скобки, он передаст функцию, а не результат, до setInterval, и у вас не возникнут проблемы.

setTimeout(this.Poll, this.Interval); 

В противном случае вызов функции сразу и ничего не держит this указателя больше, и IE просто удаляет его.

В фиксированном варианте this.Poll будет содержать указатель на this и не будет удален.

+0

удары Disaster даже без скобок. Вы используете IE! = 8? –

+0

Сделайте этот трюк с помощью 'self' J-P, который выложил тогда. Если это не сработает, ваш объект будет GC'd (или не был создан), прежде чем вы вызовете 'Start'. Итак, убедитесь, что objPoll существует до того, как вы вызываете 'Start()' и пытаетесь потерять 'var' перед' objPoll = new cPoll ("objPoll"); ' – vava

+0

GC возможен, но он есть, когда я нажимаю Start, потому что Начинается вызов из экземпляра. Если бы этого не было, это не началось бы. –

0
var self = this; 
this.tmo = setTimeout(function(){ 
    self.Poll(); 
}, this.iInterval); 
+0

self = this = pointer = null -> self = null –

+0

Что значит? – James

+0

'this = pointerToInstanceInMemory', поэтому' self = pointerToInstanceInMemory' – James

0

Я дал ответ на аналогичный вопрос сегодня, когда я создал класс голосования с нуля. Вы можете принять его для себя. В целях не дублируя, вот ссылка ссылка на вопрос, сказала:

Poll the Server with Ajax and Dojo *

* Несмотря на название, мое решение предлагает как «ваниль» и стили Dojo.

0

Вы можете использовать эту удобную небольшую обертку, чтобы выполнить функцию периодически в заданном интервале (1 сек по умолчанию):

function tick(func, interval) { 
    return (function() { 
     if(func()) 
      setTimeout(arguments.callee, interval || 1000); 
    })(); 
} 

функция повторяется до тех пор, пока не возвращает ложь:

tick(function() { 
    if(should stop) return false; 
    do stuff 
    return true; 
}); 

Если функция представляет собой метод, сделайте замыкание, как показано на рисунке

// inside your object 
var me = this; 
tick(function() { 
    return me.doStuff(); 
}); 
1

Я просто хотел сказать, что этот трюк сэкономил мне тонну волоса.

Я не думал создавать ссылку как это. Это означает, что динамически созданные элементы с событиями щелчка могут вызвать правильный экземпляр моего класса.

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