-
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