eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programmingKolejkowanie w JavaScript › Re: Kolejkowanie w JavaScript
  • Path: news-archive.icm.edu.pl!news.gazeta.pl!not-for-mail
    From: emil <e...@p...onet.pl>
    Newsgroups: pl.comp.programming
    Subject: Re: Kolejkowanie w JavaScript
    Date: Sun, 11 Jan 2009 16:29:28 +0100
    Organization: "Portal Gazeta.pl -> http://www.gazeta.pl"
    Lines: 59
    Message-ID: <gkd38q$r2f$1@inews.gazeta.pl>
    References: <gkaa45$8op$1@mx1.internetia.pl>
    NNTP-Posting-Host: sj036.multi-play.net.pl
    Mime-Version: 1.0
    Content-Type: text/plain; charset=utf-8; format=flowed
    Content-Transfer-Encoding: 8bit
    X-Trace: inews.gazeta.pl 1231687770 27727 195.225.250.133 (11 Jan 2009 15:29:30 GMT)
    X-Complaints-To: u...@a...pl
    NNTP-Posting-Date: Sun, 11 Jan 2009 15:29:30 +0000 (UTC)
    X-User: emjot_nntp
    In-Reply-To: <gkaa45$8op$1@mx1.internetia.pl>
    User-Agent: Thunderbird 2.0.0.19 (X11/20090105)
    Xref: news-archive.icm.edu.pl pl.comp.programming:180699
    [ ukryj nagłówki ]

    Krzysztof Antczak wrote:
    > Witam Grupowiczów.
    >
    > Staram się stworzyć coś w rodzaju kolejki funkcji, który powinny się
    > wykonać jedna PO drugiej. I tu pojawia się problem, ponieważ javascript
    > jest bardzo oporny w kierunku ułatwienia dostępu do jakiegoś
    > ReflectionAPI. Wszystkie moje pomysły zawiodły, ze względu na
    > ograniczenia JS, a było tych pomysłów naprawdę sporo.
    >
    > Do rzeczy (przykład jednego z pomysłów):
    >
    > var queue = new QueueManager ();
    > queue.add( 'foo' );
    > queue.add( 'bar' );
    > queue.add( 'function () {}' );
    > queue.exec ();
    >
    > Niestety wygląda ładnie, a działać nie chce. Dlaczego? Dlatego, że
    > istnieją w JS funkcje typu: setTimeout/setInterval, które niweczą cały
    > misterny plan.
    Te funkcje nie istnieją w JS, tylko są udostępniane przez obiekt window
    przeglądarki. W czystym JS ich nie ma.

    Na pozczątku z głupia frant zapytam co tak naprawdę chcesz zrobić,
    dlatego, że przeglądarkowy JS jest z natury asynchroniczny (to znaczy
    wywołanie funkcji jest z reguły odpowiedzią na jakieś zdarzenie) i
    raczej nie programuje się w nim kolejek wykonania.

    Nie rozumiem z jakiego powodu setTimeout/setInterval niweczą plan.Nawet
    w przypadku kolejki powinieneś się nimi posłużyć,np.:

    NIE:
    for(var i=0;i<queue.length;i++) {
    queue[i]()
    }

    TAK:
    var intv = setInterval(function() {
    if(!queue.length) {
    clearInterval(intv);
    return;
    }
    queue.pop()()
    },100);

    bo jeśli suma czasu wykonania Twoich funkcji będzie za długa, to
    zawiesisz przeglądarke z ładnym komunikatem do usera czy chce przerwać
    działania sktyptów.

    Co jeszcze. JavaScript w przeglądarce jest jednowątkowy. To znaczy, że
    jeśli wykonujesz jedną funkcję do czasu jej zakończenia nie uruchomi się
    żadna inna funkcja niezależnie od tego czy wywołujesz ją normalnie czy
    przez setTimeout.

    Więc: jesteś pewien, że potrzebujesz kolejki wykonania?
    IMHO raczej powinieneś inaczej podejść do problemu.

    Pozdrawiam
    emil

Podziel się

Poleć ten post znajomemu poleć

Wydrukuj ten post drukuj


Następne wpisy z tego wątku

Najnowsze wątki z tej grupy


Najnowsze wątki

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: