Hirdetés

Keresés

Új hozzászólás Aktív témák

  • dqdb
    nagyúr

    Szükségem lenne egy függvényre, ami egészen addig nem engedi tovább futni a szkript többi részét, amíg a szükséges változó értéket nem kap (mert utána azzal az értékkel dolgoznék tovább).
    (Nem lehet összedrótozni/egybeágyazni őket sehogy, hogy csak akkor fusson a szkript maradék része, ha az érték visszajött az adatbázisból. Sajnos ez nem megoldható.)

    Ilyesmit kezdtem el összerakni, de nem úgy működik, ahogy szeretném:
    function waitForResult(resultToWaitFor, acceptValue){
        console.log("In waitForResult. resultToWaitFor = " + resultToWaitFor);
        if (typeof resultToWaitFor !== 'undefined'){
            setTimeout(function(){
                waitForResult();
                console.log("Waiting for result.")
                if (resultToWaitFor >= acceptValue){
                    return 0;
                }
            }, 100);
        } else {
            console.log("Megvan az eredmény.");
            return 0;
        }
    }

    ***** Az elképzelés lényege az lenne, hogy 100ms-onként ellenőrzi, hogy kapott-e már értéket a vizsgált változó. Ha nem, ellenőrzi újra (rekurzívan). Ha kapott, kilép, és engedi futni az utána következő részeket. Nem ad vissza értéket. Semmit nem csinál, csak "feltartja" a szkriptet addig, amíg a változó értéket nem kap. (És mindig kap. Jellemzően pár tized mp-en belül, viszont van, hogyha "túlbuzgó" a user, eljuthat ahhoz a részhez a kódhoz, ahol használni kell ezt az értéket, mielőtt még materializálódna a változó. Ezt szeretném orvosolni.)

    Ha a jelen formájában használom, hiába érkezik meg az érték, folyamatosan pörög tovább (logban látszódik, hogy Waiting for result-ot dobálja eszement módon utána is).

    Pont ennek utánajárva találtam, hogy az első if-ágban is kell egy return - a belső ellenőrzést (és vele az acceptValue-t) ezért hoztam be. De nem segített.

    A return 0 azért lett, mert a sima return-nal nem (sem működött), próbáltam hát így is.

    ----------
    Vagy csináljak egy setTimeout-os, while-os ellenőrzést, a végén emelgetve egy számlálót, és megadok egy értéket neki, amit soha nem érhet el? Max ez a backup plan, de jó lenne a későbbiekben is egy ilyen "waitForResult" függvény, jó lenne azt rendbe rakni.

    Irányt tudnátok mutatni a témában, kérlek?

    Alapvetően hibás, amit csinálni szeretnél. Persze mindenki valami hasonlót szeretne elérni, amikor először kell aszinkron hívást beépíteni az addig szinkron homokozójába, de ettől még nem így kell :DDD

    1. az adatbázis-lekérdezés előtt letiltasz minden beviteli mezőt
    2. a lekérdezés befejezésekor lefutó callbackben engedélyezed a mezőket
    A módszer hátránya, hogy a letiltás látható változást hoz, ami gyors lefutás esetében zavaró villogást eredményezhet.

    1. az adatbázis-lekérdezés előtt az előtérbe hozol egy teljes oldalt lefedő 100%-os átlátszóságú DIV-et, ami az egéreseményeket blokkolja az oldalon található elemek elől, a billentyűzetről neked kell gondoskodnod a fókusz valahová áthelyezésével
    2. a lekérdezés befejezésekor lefutó callbackben a háttérbe küldöd a DIV-et
    A módszer hátránya, hogy lassú lefutás esetében a felhasználó azt érzékeli, hogy "lefagyott" az oldal, mert akárhová klikkel, nem reagál

    1. az adatbázis-lekérdezés előtt ugyanazt csinálod, mint az előző megoldásban és setTimeout segítségével ~300 ms késleltetéssel (a pontos értéket neked kell kikísérletezni, hogy a felhasználónak ne villogjon feleslegesen a képernyő, de ne érezze azt sem, hogy "lefagyott" az oldal)
    2. ha a setTimeout callback fut le először, akkor előtérbe hozol egy másik teljes képernyős DIV-et, ami részlegesen átlátszó és rajta szöveggel, hogy várjon a user
    2. a lekérdezés befejezésekor lefutó callbackben tolsz egy cancelTimeout-ot, és a háttérbe küldöd mindkét DIV-et

Új hozzászólás Aktív témák