Keresés

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

  • Taci
    addikt

    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

    Köszönöm a tippet.

    A UI már eleve így készült, felkészítve arra, hogy mi történjen, amíg eredményre vár az adatbázisból.

    Ez most csak egy extrém ritka lehetőség, amit kezelni akartam, de úgy vagyok vele, legyen minden rendesen lekezelve, még akkor is, ha csak nagyon kis eséllyel fordulhat elő.

    Szóval végül úgy oldottam meg, hogy az egész JS-kódrészt, ami a várt változóval dolgozna, beletettem egy setTimeout-ba, aminek a végén a várakozási időt egy változó állítja be. Ezt a változót a setTimeout előtt egy if-else állítja be: ha undefined a változó típusa, akkor még nem érkezett meg a válasz, ilyenkor váratom 500 ms-t (még tesztelem, hogy ez elég-e, vagy nem-e túl sok stb.). Ha viszont már megvan az érték, akkor 0-ra állítja, és azonnal lefut.

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