Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V   1 2 >  
Reply to this topicStart new topic
> [JS] Zmienna zwraca undefined
Dominator
post 20.04.2013, 21:45:29
Post #1





Grupa: Zarejestrowani
Postów: 565
Pomógł: 15
Dołączył: 11.10.2010

Ostrzeżenie: (20%)
X----


Dlaczego zmienna IS zwraca mi 'undefined'? Funkcja GetUAnswers() zwraca mi liczbę. Czyli zmienna IS powinna mi zwrócić liczbę, a nie zwraca...

  1. var IS;
  2. setInterval(function(){
  3. IS = GetUAnswers();
  4. }, 1000);
  5.  
  6. alert(IS);
Go to the top of the page
+Quote Post
kamil4u
post 20.04.2013, 21:57:02
Post #2





Grupa: Zarejestrowani
Postów: 2 350
Pomógł: 512
Dołączył: 4.01.2009
Skąd: Wrocław / Świdnica

Ostrzeżenie: (0%)
-----


Funkcja IS = GetUAnswers(); wykona się 1s po tym jak wywołujesz alerta. Dlatego zmienna w chwili wyświetlania = undefined


--------------------
Go to the top of the page
+Quote Post
Dominator
post 20.04.2013, 22:01:44
Post #3





Grupa: Zarejestrowani
Postów: 565
Pomógł: 15
Dołączył: 11.10.2010

Ostrzeżenie: (20%)
X----


Jak temu zapobiec?
Go to the top of the page
+Quote Post
Szymciosek
post 20.04.2013, 22:03:04
Post #4





Grupa: Zarejestrowani
Postów: 1 168
Pomógł: 126
Dołączył: 5.02.2010
Skąd: Świdnica

Ostrzeżenie: (0%)
-----


Wywoływać albo getUAnserws na początku skryptu od razu albo opóźnić też wyświetlenie alert.
Go to the top of the page
+Quote Post
Dominator
post 20.04.2013, 22:07:58
Post #5





Grupa: Zarejestrowani
Postów: 565
Pomógł: 15
Dołączył: 11.10.2010

Ostrzeżenie: (20%)
X----


Opóźniłem ten alert... bez pożądanego rezultatu.
Ogólnie rzecz biorąc nie muszę wyświetlać alertu, gdyż tą zmienną IS chcę wyświetlić w divTag.innerHTML = IS; Ale również w tym przypadku jest undefined.

  1. setTimeout(function(){
  2. alert(IS);
  3. },100);
Go to the top of the page
+Quote Post
kamil4u
post 20.04.2013, 22:18:41
Post #6





Grupa: Zarejestrowani
Postów: 2 350
Pomógł: 512
Dołączył: 4.01.2009
Skąd: Wrocław / Świdnica

Ostrzeżenie: (0%)
-----


Opóźniłeś o 100ms - funkcja się wykona po 1000ms. Poza tym robisz to źle. Opisz problem dokładniej - co chcesz uzyskać?


--------------------
Go to the top of the page
+Quote Post
Dominator
post 20.04.2013, 22:25:32
Post #7





Grupa: Zarejestrowani
Postów: 565
Pomógł: 15
Dołączył: 11.10.2010

Ostrzeżenie: (20%)
X----


Cytat(kamil4u @ 20.04.2013, 23:18:41 ) *
Opóźniłeś o 100ms - funkcja się wykona po 1000ms. Poza tym robisz to źle. Opisz problem dokładniej - co chcesz uzyskać?


Wiem, mam spore braki w Javascript.

Co 1000ms ładują mi się zdarzenia na stronie (tzn. ładują się wpisy). Chcę wyświetlić ile ich jest.
Gdy dam na początku $("#ratio").size(); to otrzymam pierwsze 25 zdarzeń, a później gdy minie kolejne 1000ms to tych zdarzeń ma być 50. Wobec tego muszę robić setInterval aby na bieżąco otrzymywać ilość zdarzeń. Gdy nie użyję setInterval to wywołując funkcję, która ma mi zwrócić ilość zdarzeń - otrzymam 25 zamiast 50.
Go to the top of the page
+Quote Post
kamil4u
post 20.04.2013, 22:34:05
Post #8





Grupa: Zarejestrowani
Postów: 2 350
Pomógł: 512
Dołączył: 4.01.2009
Skąd: Wrocław / Świdnica

Ostrzeżenie: (0%)
-----


No to wstaw tego alerta co miałeś w pierwszym poście do setIntervala.

Kod
    var IS;
    setInterval(function(){
    IS = GetUAnswers();
    alert(IS);
    }, 1000);


Uwaga: Wstawianie alerta w setInterval to głupi pomysł i może Ci utrudnić korzystanie z przeglądarki. To jedynie przykład. Docelowo wstaw tam innerHTML. Jak chcesz przetestować działanie na alertach to radzę zwiększyć czas na około 5s( tylko do testów )


--------------------
Go to the top of the page
+Quote Post
Dominator
post 20.04.2013, 22:38:17
Post #9





Grupa: Zarejestrowani
Postów: 565
Pomógł: 15
Dołączył: 11.10.2010

Ostrzeżenie: (20%)
X----


Nie mogę użyj innerHTML w tym, ponieważ co 1000ms będzie mi się tworzyć tekst.
Go to the top of the page
+Quote Post
Szymciosek
post 20.04.2013, 22:47:54
Post #10





Grupa: Zarejestrowani
Postów: 1 168
Pomógł: 126
Dołączył: 5.02.2010
Skąd: Świdnica

Ostrzeżenie: (0%)
-----


kamil4you, a nie może on skorzystać z konsoli zamiast alert?

console.log(IS);
Go to the top of the page
+Quote Post
Dominator
post 20.04.2013, 22:52:28
Post #11





Grupa: Zarejestrowani
Postów: 565
Pomógł: 15
Dołączył: 11.10.2010

Ostrzeżenie: (20%)
X----


Cytat(Szymciosek @ 20.04.2013, 23:47:54 ) *
kamil4you, a nie może on skorzystać z konsoli zamiast alert?

console.log(IS);


W konsoli to działa super, tylko muszę użyć zmiennej IS poza tym setInterval.
Go to the top of the page
+Quote Post
pyro
post 21.04.2013, 08:30:27
Post #12





Grupa: Zarejestrowani
Postów: 2 148
Pomógł: 230
Dołączył: 26.03.2008

Ostrzeżenie: (0%)
-----


http://plugins.jquery.com/postpone/

  1. $.every('1s', 'Twoj alert').progress(function(text){
  2. alert(text); // EDIT: a lepiej console.log(text); ;)
  3. });


Ten post edytował pyro 21.04.2013, 08:39:40


--------------------
ET LINGUA EIUS LOQUETUR IUDICIUM
Go to the top of the page
+Quote Post
Dominator
post 21.04.2013, 09:04:13
Post #13





Grupa: Zarejestrowani
Postów: 565
Pomógł: 15
Dołączył: 11.10.2010

Ostrzeżenie: (20%)
X----


Wy chyba nie wiecie o co mi chodzi biggrin.gif

Jak użyć zmiennej IS poza tym setInterval abym dostawał liczbę zamiast undefined?

  1. var IS;
  2. setInterval(function(){
  3. IS = GetUAnswers();
  4. console.log(IS); //działa, dostaję liczbę
  5. }, 1000);
  6. console.log(IS); //nie działa, dostaję undefined


Ten post edytował Dominator 21.04.2013, 09:05:05
Go to the top of the page
+Quote Post
pyro
post 21.04.2013, 09:06:40
Post #14





Grupa: Zarejestrowani
Postów: 2 148
Pomógł: 230
Dołączył: 26.03.2008

Ostrzeżenie: (0%)
-----


@Dominator, dostałeś odpowiedź dlaczego tak się dzieje, że jest undefined, a ja Ci podałem przykład jak to rozwiązać. Więć właściwie... czego Ty jeszcze chcesz? closedeyes.gif


--------------------
ET LINGUA EIUS LOQUETUR IUDICIUM
Go to the top of the page
+Quote Post
Dominator
post 21.04.2013, 09:26:38
Post #15





Grupa: Zarejestrowani
Postów: 565
Pomógł: 15
Dołączył: 11.10.2010

Ostrzeżenie: (20%)
X----


Zrobiłem tak, jak napisałeś i znowu dostaję undefined... facepalmxd.gif

Ten post edytował Dominator 21.04.2013, 09:27:09
Go to the top of the page
+Quote Post
pyro
post 21.04.2013, 09:30:45
Post #16





Grupa: Zarejestrowani
Postów: 2 148
Pomógł: 230
Dołączył: 26.03.2008

Ostrzeżenie: (0%)
-----


Pokaż kod - jak będzie sensowny to pooprawię smile.gif


--------------------
ET LINGUA EIUS LOQUETUR IUDICIUM
Go to the top of the page
+Quote Post
mortus
post 21.04.2013, 09:37:52
Post #17





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

Ostrzeżenie: (0%)
-----


Dzieje się tak dlatego, że kolejne "komendy" JS wykonywane są niemal równocześnie. Trzeba użyć jakiegoś callback-a. pyro podał Ci link do gotowej biblioteki w jQuery. Prościej można to pokazać w taki sposób:
[JAVASCRIPT] pobierz, plaintext
  1. function myCallback() {
  2. console.log('myCallback: ' + IS);
  3. }
  4. var IS;
  5. setInterval(function(){
  6. IS = GetUAnswers();
  7. console.log('setInterval: ' + IS);
  8. myCallback();
  9. }, 5000);
[JAVASCRIPT] pobierz, plaintext

Na żywo - odpal konsolę i sprawdź.
Jednak postpone z pewnością ma zaimplementowane wszystkie niezbędne funkcjonalności, dlatego warto z tego skorzystać.
Go to the top of the page
+Quote Post
viking
post 21.04.2013, 11:04:25
Post #18





Grupa: Zarejestrowani
Postów: 6 365
Pomógł: 1114
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


Najlepiej zainteresować się tym tematem http://api.jquery.com/category/deferred-object/


--------------------
Go to the top of the page
+Quote Post
Dominator
post 21.04.2013, 14:43:11
Post #19





Grupa: Zarejestrowani
Postów: 565
Pomógł: 15
Dołączył: 11.10.2010

Ostrzeżenie: (20%)
X----


Powoli, powoli udaje mi się zrobić to, co chcę, ale mam pewien problem:

  1. $.every('1s').progress(function(){
  2. divTag.innerHTML += GetUAnswers();
  3. });


Sprawa wygląda tak, że co 1000ms otrzymuję liczbę, a ona zamiast się aktualizować to ciągle dodaje się do diva. Co zrobić aby ona się nie dodawała, tylko aktualizowała?

Chcę aby to wyglądało tak: "Pytań: 25" - > "Pytań: 50", a nie "Pytań: 2550" (tak jest obecnie).

Wszystkim oczywiście kliknąłem "pomógł", bo na swój sposób mi pomogliście smile.gif

Ten post edytował Dominator 21.04.2013, 14:43:48
Go to the top of the page
+Quote Post
Szymciosek
post 21.04.2013, 14:55:10
Post #20





Grupa: Zarejestrowani
Postów: 1 168
Pomógł: 126
Dołączył: 5.02.2010
Skąd: Świdnica

Ostrzeżenie: (0%)
-----


Dzieje się tak, bo masz tam += czyli do tekstu, który już istnieje on dodaje kolejny.
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 27.04.2024 - 12:02