eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programming › Kolejkowanie w JavaScript
Ilość wypowiedzi w tym wątku: 11

  • 1. Data: 2009-01-10 14:00:18
    Temat: Kolejkowanie w JavaScript
    Od: Krzysztof Antczak <k...@l...pl>

    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.

    Jakieś pomysły? :)

    Pozdrawiam,
    Krzysztof Antczak


  • 2. Data: 2009-01-10 16:59:17
    Temat: Re: Kolejkowanie w JavaScript
    Od: porneL <n...@p...net>

    On Sat, 10 Jan 2009 14:00:18 -0000, Krzysztof Antczak <k...@l...pl> wrote:

    > 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.

    Raczysz żartować. for(i in window) alert(i + ': ' + window[i])

    > 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.

    Nie rozumiem. Chcesz synchroniczy setTimeout?

    > Jakieś pomysły? :)

    Na początek mógłbyś nie zgapiać przestarzałego sposobu przekazywania kodu (z eval())
    i wykorzystać to, że funkcje są obiektami, jak to się w XXI wieku robi.

    queue = {
    q: [],
    add: function(f){ this.q[this.q.length] = f },
    exec: function(){ for(var i in this.q) this.q[i]() },
    execAsync: function(){ var self=this; setTimeout(function(){self.exec()},0) }
    }

    queue.add(foo)
    queue.add(bar)
    queue.add(function(){/*...*/});
    queue.exec();

    --
    this.author = new Geek("porneL");


  • 3. Data: 2009-01-10 17:18:51
    Temat: Re: Kolejkowanie w JavaScript
    Od: Krzysztof Antczak <k...@l...pl>

    porneL pisze:
    > On Sat, 10 Jan 2009 14:00:18 -0000, Krzysztof Antczak
    > <k...@l...pl> wrote:
    >
    > Raczysz żartować. for(i in window) alert(i + ': ' + window[i])

    Dzięki.

    > Na początek mógłbyś nie zgapiać przestarzałego sposobu przekazywania
    > kodu (z eval()) i wykorzystać to, że funkcje są obiektami, jak to się w
    > XXI wieku robi.

    Off topic. Więc problem nadal nie rozwiązany.

    Pozdrawiam,
    Krzysztof Antczak


  • 4. Data: 2009-01-10 17:39:10
    Temat: Re: Kolejkowanie w JavaScript
    Od: "Rafal\(sxat\)" <g...@o...pl.usunto>


    > Off topic. Więc problem nadal nie rozwiązany.


    wiec mozna sprobowac tak w kazdej funkcji gdzie masz SetTimeOut wykonac cos
    takie

    funkcja[n]_czeka=true;
    settimeout(....)...
    ...
    funkcja[n]_czeka=false;


    i wtedy masz w queue przy pobraniu nastepnej pozycji do wykoanania
    - czy funkcja[n]_czeka jesli tak to np petla... ewentualnie settimeout... i
    oczekiwanie na zwolnienie funkcji
    to mi przypomina pisanie serwera w jednym watku :) gdzie nie bylo watkow
    (m.in VB4.0)


    bo faktycznie w JS nie widac mutexow ;) o ktore pytasz wiec trzeba je jakos
    zasymulowac, no chyba ze sie myle... bo w dokumentacji nie znalazlem...


    Rf



  • 5. Data: 2009-01-10 17:46:31
    Temat: Re: Kolejkowanie w JavaScript
    Od: Krzysztof Antczak <k...@l...pl>

    Rafal(sxat) pisze:
    > wiec mozna sprobowac tak w kazdej funkcji gdzie masz SetTimeOut wykonac cos
    > takie
    >
    > funkcja[n]_czeka=true;
    > settimeout(....)...
    > ...
    > funkcja[n]_czeka=false;

    Mniej więcej tak też próbowałem, chociaż wcześniej nie znałem sposobu
    przeiterowania po zdefiniowanych funkcjach w silniku JS. Teraz tylko
    pytanie, czy można odróżnić funkcje zdefiniowaną przez użyszkodnika od
    tej natywnej? Bo jak tak patrze to różnic nie widzę.

    Wtedy faktycznie mogę np. każdej funkcji dorzucić coś od siebie ;)

    Pozdrawiam,
    Krzysztof Antczak


  • 6. Data: 2009-01-10 18:28:40
    Temat: Re: Kolejkowanie w JavaScript
    Od: porneL <n...@p...net>

    On Sat, 10 Jan 2009 17:46:31 -0000, Krzysztof Antczak <k...@l...pl> wrote:

    >> funkcja[n]_czeka=true;
    >> settimeout(....)...
    >> ...
    >> funkcja[n]_czeka=false;
    >
    > Mniej więcej tak też próbowałem, chociaż wcześniej nie znałem sposobu
    > przeiterowania po zdefiniowanych funkcjach w silniku JS.

    Nie da się. W JS funkcje są zwykłymi obiektami, które mogą być tworzone w każdej
    chwili i nawet nie muszą być przypisane do żadnego obiektu. Iterowanie po wszystkich
    funkcjach w JS to jak interowanie po wszystkich intach w C.

    np. queue.add(function(){}) // kompletnie anonimowa - nie znajdziesz jej w window ani
    innym obiekcie (nie licząc arguments w wywołaniu add())

    queue.add((function(){ // dostaniesz anonimową funkcję odwołującą się do
    zmiennej lokalnej - nie masz szans na inspekcję f().
    var f = function(){}
    return function(){ f() }
    })())


    var s;
    queue.add(function(){s()}) // nie dowiesz się, że funkcja używa setTimeout
    s = window.setTimeout


    Z drugiej strony, jeśli nie pasi ci asynchroniczność setTimeout, to nie musisz
    zakrzywiać całej czasoprzestrzeni. Możesz zmienić te funkcje:

    window.setTimeout = function( f, timeout ) { f() }

    Powyższa implementacja jest zbyt uproszczona - brak kompatybilności ze starą
    składnią, dodatkowymi parametrami i obsługi clearTimeout(), ale to wszystko jest
    wykonalne. Zobacz jak JSowe frameworki do Unit Testów to robią.

    --
    http://sblam.com
    this.author = new Geek("porneL");


  • 7. Data: 2009-01-10 19:17:01
    Temat: Re: Kolejkowanie w JavaScript
    Od: Krzysztof Antczak <k...@l...pl>

    porneL pisze:
    > window.setTimeout = function( f, timeout ) { f() }
    > Powyższa implementacja jest zbyt uproszczona - brak kompatybilności ze
    > starą składnią, dodatkowymi parametrami i obsługi clearTimeout(), ale to
    > wszystko jest wykonalne. Zobacz jak JSowe frameworki do Unit Testów to
    > robią.

    Ano właśnie takiego zaimplementowania własnego setTimeout się już
    podejmowałem i nawet działał (gotowiec wykopany na góglach), jednak
    nadal zostało setInterval, za którego zabrać się nie potrafiłem.


    Pozdrawiam,
    Krzysztof Antczak


  • 8. Data: 2009-01-10 19:50:49
    Temat: Re: Kolejkowanie w JavaScript
    Od: "Rafal\(sxat\)" <g...@o...pl.usunto>

    > podejmowałem i nawet działał (gotowiec wykopany na góglach), jednak
    > nadal zostało setInterval, za którego zabrać się nie potrafiłem.


    to moze ja nadpisac?

    <script type="text/javascript">
    var i=0;
    function setInterval(fn,int)
    {
    window.status='czesc';
    }

    function changeStatusBarText()
    {
    window.status = i++;
    }

    setInterval("changeStatusBarText();", 1000);
    </script>

    rf











    --
    www.sxar.pl



  • 9. Data: 2009-01-11 15:29:28
    Temat: Re: Kolejkowanie w JavaScript
    Od: emil <e...@p...onet.pl>

    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


  • 10. Data: 2009-01-11 16:18:01
    Temat: Re: Kolejkowanie w JavaScript
    Od: Krzysztof Antczak <k...@l...pl>

    emil pisze:
    > Te funkcje nie istnieją w JS, tylko są udostępniane przez obiekt window
    > przeglądarki. W czystym JS ich nie ma.

    Tak więc są dostępne ;)


    > 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);

    Jasne, ale tak jak wspomniałem. Co z gotowymi bibliotekami, które w
    ogóle nie obsługują w ten sposób tych funkcji ?

    > 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.

    Możliwe, całkiem możliwe, ale to nie tłumaczy mi takiego działania:

    setTimeout("window.status = 1;", 200);
    setTimeout("window.status = 2;", 150);
    setTimeout("window.status = 3;", 100);
    setTimeout("window.status = 4;", 50);

    Oczywiście z wiadomej przyczyny cyfra "4", nie będzie tu ostatnią która
    się pojawi w pasku stanu.

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

    Nie można podejść inaczej do _TEGO_ problemu, gdyż problemem jest
    właśnie uzyskanie tej kolejki.

    > Pozdrawiam
    > emil


    Pozdrawiam,
    Krzysztof Antczak

strony : [ 1 ] . 2


Szukaj w grupach

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: