Topic: setTimeout funkcijos problema

Sveiki,

taigi, paspaudus nuoroda yra iskvieciama javascript funkcija. Kas kelias sekundes funkcija iskviecia save vel.
Problema - jeigu paspaudi nuoroda kelis kartus, tai ir setTimeout isijungia kelis kartus. Kaip to isvengti?

Dekui

Re: setTimeout funkcijos problema

var timeout = null;

var some_function = function () {
   if (timeout != null) clearTimeout(timeout);
   timeout = setTimeout(some_function,2000);
}

onclick = "some_function()"

Kažkas pan.

MongoDB Certified Developer
MongoDB Certified DBA
Zend Certified Engineer

Re: setTimeout funkcijos problema

dekui, dabar tik viena setTimeout funkcija isijungia, bet jos isjungt visai nebeeina.

Re: setTimeout funkcijos problema

Kaip gali nepavykti išjungti? setTimeout funkcija grąžina skaičių, kuris nuolat didėja. žinodamas tinkamą skaičių visada galėsi sustabdyti timeoutus. Bet kažkaip įtariu, kad tiesiog kelis kartus setini timeoutą, o clearini veliau, bet clearindamas visada paduodi tą patį. Tokiu atveju gali tiesiog įsivesti kokį "saugiklį" kurios reikšmės tarkime true/false. Kai true - neleidi užsetinti timeout, kai false - leidi. Tas būna naudinga ajax užklausų metu, kad nepaleistum kelių paklausimų vienu metu, nes atsakymai gryš nebūtinai ta pačia tvarka :)

MongoDB Certified Developer
MongoDB Certified DBA
Zend Certified Engineer

Re: setTimeout funkcijos problema

ziopla klaida buvau padares..
o gali daugiau pasakyti apie "saugikli"? :)

Re: setTimeout funkcijos problema

var swtc = false;
var some_function = function() {
 if (swtc == true) return;
 swtc = true;
 $.post('url',{},funcrion(response) {
  // some cool stuff
  swtc = false;
 });
} 


onclick = "some_function()"
MongoDB Certified Developer
MongoDB Certified DBA
Zend Certified Engineer

Re: setTimeout funkcijos problema

aisku, na, cia kaip ir tas pats kaip ir

var timeout = null;

?

Re: setTimeout funkcijos problema

Na pirmu atveju nuolatos clickinant ajax užklausa taip niekados ir neprasidės, antru prasidės.

MongoDB Certified Developer
MongoDB Certified DBA
Zend Certified Engineer

Re: setTimeout funkcijos problema

Aisku, dekui. O kame problema kai iskvieciu dvi javascript funkcijas, kartais negaunu norimu rezultatu? PVZ, yra du DIV laukai ir jie abu yra atnaujinami su ajax, bet kartais abiejuosie atsiranda ta pati pirmos funkcijos duodama informacija

Re: setTimeout funkcijos problema

įvelta klaida kode, ne kitaip.

MongoDB Certified Developer
MongoDB Certified DBA
Zend Certified Engineer

Re: setTimeout funkcijos problema

na nezinau...
cia index.php:

<div id="div1"></div>
<div id="div2"></div>
<script type="text/javascript">fn1(); fn2();</script>

cia javascript.js:

var xmlHttp;

function GetXmlHttpObject()
{
    var xmlHttp = null;
    try
    {
        xmlHttp = new XMLHttpRequest();
    }
    catch (e)
    {
        try
    {
        xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
    }
    catch (e)
    {
        xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
    }
    }
    return xmlHttp;
}

function state1()
{
    switch (xmlHttp.readyState)
    {
        case 0:
        case 1:
        case 2:
        case 3: document.getElementById("div1").innerHTML = 'kraunama'; break;
        case 4:
        document.getElementById("div1").innerHTML = xmlHttp.responseText;
        break;
        default: break;
    }
}

function state2()
{
    switch (xmlHttp.readyState)
    {
        case 0:
        case 1:
        case 2:
        case 3: document.getElementById("div2").innerHTML = 'kraunama'; break;
        case 4:
        document.getElementById("div2").innerHTML = xmlHttp.responseText;
        break;
        default: break;
    }
}

function fn1()
{
    xmlHttp = GetXmlHttpObject();
    var url = "url.php?sid=" + Math.random();
    xmlHttp.onreadystatechange = function() { state1() };
    xmlHttp.open("GET", url, true);
    xmlHttp.send(null);
    timeout = setTimeout("fn1()", 10000);
}

function fn2()
{
    xmlHttp = GetXmlHttpObject();
    var url = "url2.php?sid=" + Math.random();
    xmlHttp.onreadystatechange = function() { state2() };
    xmlHttp.open("GET", url, true);
    xmlHttp.send(null);
    timeout2 = setTimeout("fn2()", 60000);
}

norejau padaryti, kad pirma funkcija atnaujintu "div1", o antra - "div2", bet dabar ir "div1" ir "div2" rodomi tie patys, pirmos funkcijos grazinti duomenys

Re: setTimeout funkcijos problema

$.post('/url.php?sid='+Math.random(),{},function(data) {$('#div1').html(data)});
$.post('/url2.php?sid='+Math.random(),{},function(data) {$('#div2').html(data)});

Neįmanoma, kad neveiktų. Ir tikriausia supranti, kad neapsimoka rašyti kodo kuris jau yra parašytas.

MongoDB Certified Developer
MongoDB Certified DBA
Zend Certified Engineer

Re: setTimeout funkcijos problema

Issiaiskinau kame problema:
kai iskvieciu dvi funkcijas vienu metu, reikia abiem sukurti atskira xmlHttp objekta. Kadangi abiejom funkcijom priskirdavau ta pati ( xmlHttp = GetXmlHttpObject(); )  ir gaudavos nesamones :)

zygis, turi omeny naudoti jquery?

Re: setTimeout funkcijos problema

taip

MongoDB Certified Developer
MongoDB Certified DBA
Zend Certified Engineer

Re: setTimeout funkcijos problema

Na, nemanau, kad verta naudoti jquery biblioteka kai man tereikia keliu nedideliu funkciju darbui atlikti :)

Re: setTimeout funkcijos problema

Būtum sutaupęs kelias dienas, tad - verta.

MongoDB Certified Developer
MongoDB Certified DBA
Zend Certified Engineer

Re: setTimeout funkcijos problema

Sutaupysiu rasydamas koda, bet puslapis daugiau resursu reikalaus :)

Re: setTimeout funkcijos problema

šiuo konkrečiu atveju gal ir sutaupai, bet nežinai ar tavo parašytas būdas efektyviai naudoja naršyklės išskiriamus resursus. Kelios netinkamai aprašytos funkcijos gali sulėtinti viską taip, kad pakrautas framework'as ir jo atliktas darbas sunaudos visko mažiau.
Va geras pavyzdys kiek visko dar nežinai (spėju daugelis kai kuriuos dalykus išgirs pirmą kartą): https://developers.google.com/live/show … BjB1YwDDA/

MongoDB Certified Developer
MongoDB Certified DBA
Zend Certified Engineer

Re: setTimeout funkcijos problema

dekui