[Js] jak wywołac metode obiektu z użyciem setTimeout

0

Jak w temacie, a dokłądniej potrzebowałbym zrobić coś co opóźni mi skrypt o kokkretny czas pzy wywołaniu metody mojego obiektu.
Czyli alternatywa dla czegoś co niestety nie działa :/ setTimeout('this.metoda();',1000);
Będe wdzięczny za każdą sugestię

0

a setTimeout(this.metoda, 1000); ?

0

no właśnie nie bardzo - próbowałem już chyba wszystkiego :|

0

no niestety SOA#1 - po kliknięciu i zjechaniu z linka pojawia się komunikat, a po sekundzie drugi:

<script>
function whatever(wtf){
  wtf.onmouseout = function(){
    alert('ałt !');
    setTimeout(this.onclick, 1000);
  }
  wtf.onclick = function(){
    alert('klyk !');
  }
}

</script>

<a onclick="whatever(this)" href="javascript:void(0)">test</a>
0

ehh widze ze źle sie wyraziłem
nie chodzi mi o obiekt DOM ani nic z tych rzeczy - potrzebuje sie dobrać od wewnątrz do metody mojej klasy, np

function Klasa(){
this.metoda1=function(){
alert('test');
}

this.metoda2=function(){
this.metoda1();
setTimeout('this.metoda2',1000);
}
}

var obiekt=new Klasa();
obiekt.metoda2(); // i tu chce właśnie wywołać moją metode 

pomysły?

//add
aha Twój kod nie powinien działąć bo zamiast parametru podanego w funkcji (wtf) uzyłes nie zadeklarowanej nazwy obiektu this, takze to SOA to chyba nie na miejscu ;)

0
nul napisał(a)

pomysły?

//add
aha Twój kod nie powinien działąć bo zamiast parametru podanego w funkcji (wtf) uzyłes nie zadeklarowanej nazwy obiektu this, takze to SOA to chyba nie na miejscu ;)

no to kiszka bo w setTimeout parametr już jest traktowany jako funkcja a nie jako funkcja objektu, więc wywołana funkcja z setTimeout już nie ma dostępu do "this" - można jednorazowo się odwołać jak do zwykłej funkcji - nie wiem jak to przejść :|

co do //add to użyłem nie wtf tylko this bo było już to w funkcji (zdarzeniu) obiektu więc można się odwołać do this jako czemuś prowadzącemu do tego obiektu, wtf w tym miejscu by nie zadziałało - to tak jakbyś powiedział że

nie ma prawa działać bo nie ma zdefiniowanego żadnego "this" chociaż jest to wykorzystywane na milionach stron - chyba trochę się musisz poduczyć

setTimeout('this.metoda2',1000);

totalnie bez sensu

0

Widzisz Adamo ten sposób jest dobry tylko połowicznie - ma jedną wade - uiemożliwia odwołanie się do zmiennych danego obiektu z poziomu funkcji wywołanej przez setTimeout, dzieje sie tak poniewaz wywoływana funkcja nie jest traktowana jak metoda ale jak zwykła funkcja.

chyba trochę się musisz poduczyć

Z całym szacunkiem, ale jak na razie to nie wniosłeś do tematu nic konstruktywnego (niestety) więc bądź tak miły i nie mów ze to ja musze sie poduczyć, bo to nie ja daje w przykładzie coś czego tam być nie powinno.

0

no dobra, ale napisałeś już dwie totalne głupoty, a ja chociaż ci trzymam wątek na wierzchu coby się nie utopił, bo jakoś nikt ci odpowiedzieć nie chce

0

nie chce lub nie potrafi, bo wniosek moze byc zaskakująco prosty (biorąc pod uwage tony kodu, dokumentacji i innych mniej lub bardzoej wartościowych tekstów jakie przejrzałem w poszukiwaniu rozwiązania): rozwiązania mojego problemu nie ma - a przynajmniej w prosty sposób (bez zbędnego kombinatorstwa)

0

hmmm.... a nie moze byc tak jak ponizej ?

function Klasa() {
  this.metoda1 = function() {
    alert('test');
  };
  this.metoda2 = function() {
    var self = this;
    this.metoda1();
    setTimeout(function() { 
      self.metoda2(); 
    }, 1000);
  };
}
var obiekt = new Klasa();
obiekt.metoda2();
0

ale czy to nie posypie się przy większej ilości takich klas ? będzie się nadpisywał chyba self więc to tak jakby użyć obiekt już

0

zrobilem taki maly test, nie wiem co prawda czego on dowodzi ale wyglada ze to dziala:

function Klasa(n) {
  this.className = n;
  this.metoda1 = function(s) {
    alert(this.className + ': ' + s);
  };
  this.metoda2 = function(s, t) {
    var self = this;
    setTimeout(function() { self.metoda1(s); }, t);
  };
}
var obiekt1 = new Klasa('klasa1');
obiekt1.metoda2('test1', 1000);
var obiekt2 = new Klasa('klasa2');
obiekt2.metoda2('test2', 500);

self to zmienna lokalna, dla kazdego wywolania metoda2 tworzy sie nowa wiec nie wiem czemu cos by sie mialo nadpisywac, ale ktos powinien to przetestowac bo ja nie mam lepszego pomyslu...

0

wydaje sie ze metoda przedstawiona przez piechnata bedzie działała ale ja to juz obszedłem:

setTimeout(metoda1,1000,this);

oczywiscie musi to być wywołane z wnętrza obiektu i wtedy do zawartości obiektu wewnatrz danej metody odwołuje sie poprzez zadeklarowany parametr funkcji (metody) która jest wywoływana przez setTimeout

0
nul napisał(a)

setTimeout(metoda1,1000,this);

mam nadzieje ze masz swiadomosc tego ze takie przekazywanie argumentow nie dziala w IE...

0

akurat IE jest mi zupełnie nie potrzebne ;)

0
nul napisał(a)

akurat IE jest mi zupełnie nie potrzebne ;)
[glowa] co za ignorancja

0

czemu ignorancja? firma dla której wykonuje zlecenie używa wyłącznie ff, a jest to projekt zamknięty, więc działanie na IE kompletnie nie ma znaczenia

0

Przepraszam, że znowu odświeżam ten nieszczęsny wątek, ale chciałem podzielić się z wami świeżo napisaną funkcją setApply (nie wiem czy to dobra nazwa), której zawsze brakowało mi w JS. Dzięki niej można wywołać dowolną funkcję z opóźnieniem. Czyli to, co przedtem, ale ujęte w jedną crossbrowserową metodę obiektu Function.

/* gwóźdź programu: */

Function.prototype.setApply = function(delay, thisArg, argArray) {
  var thisFunc = this;
  argArray = (argArray instanceof Array) ? argArray : [];
  return setTimeout( function() { 
    thisFunc.apply(thisArg, argArray);
  }, delay);
};

/* przykład wykorzystania: */

function TestClass() {
  this.showMsg = function(str) {
    alert(str);
  }
  this.delayedMsg = function(str, delay) {
    // opóźnione wywołanie drugiej metody tego samego obiektu
    this.showMsg.setApply(delay, this, [str]);
  }
}
// jednoczesne zdefiniowanie i wywołanie anonimowej funkcji
( function(n) {
  alert(n--);
  if(n > 0) {
    // opóźnione wywołanie bieżącej funkcji z jej wnętrza
    arguments.callee.setApply(200, null, [n]);
  } else {
    var testObj = new TestClass();
    testObj.delayedMsg('End of Test', 500);
  }
} ) (3);
0

Może więc dodasz ją do FAQ JS? :) FAQ

1 użytkowników online, w tym zalogowanych: 0, gości: 1