Lekérdezési időtúllépés korlátai
Az XMLHttpRequest objektum hátránya, hogy nem képes korlátozni a várakozási időt a kérés végrehajtására. Ez a hátrány különösen fontos a szinkron kérések esetében. Ha a kiszolgálóval való kapcsolat megszakad, a webböngésző blokkolva lesz a send () metódusban, és nem válaszol a felhasználó műveleteire. Asynchronous kérések esetén ez nem történik meg, mert a send () metódus nem blokkolódik, és a webböngésző továbbra is válaszolhat a felhasználói műveletekre. Azonban itt is van egy probléma, amely korlátozza a lekérdezés végrehajtási idejét. Tegyük fel, hogy az XMLHttpRe_ quest objektumot használó alkalmazás HTTP_query-t indított el, amikor a felhasználó rákattintott a gombra. Annak megakadályozása érdekében, hogy több kérést küldjön el, hasznos, hogy a gomb inaktív legyen, amíg a szerver válasz nem érkezik meg. De mi van akkor, ha a szerver abbamarad, vagy valami történik, ami akadályozza a kérés megválaszolását? A böngésző nem lesz blokkolva, de az inaktív gomb miatt az alkalmazás képességei korlátozottak.
Az ilyen jellegű problémák elkerülése érdekében kényelmesebb lenne beállítani a saját időtartamát a Windows.setTimeout () függvénnyel a HTTP_queries használatakor. Normális körülmények között, a válasz jön, mielőtt az időzítő felvezető hivatkozott események - ebben az esetben egyszerűen hívja Window.clearTimeout () függvényt, hogy megszünteti az időzítőt. Másrészt, ha az eseménykezelőt az időzítőről korábban hívják,
508 20. fejezet A HTTP protokoll használatával
mint a readyState tulajdonság értéke 4, a lekérdezés végrehajtása XMLHttpRequest.abort () módszerrel módosítható. Ezt követően általában meg kell mondani a felhasználónak, hogy a kérés végrehajtására irányuló kísérlet sikertelen (például a Window.alert () módszer használatával). Ha ebben a hipotetikus példában a gombot a lekérdezés futtatásával deaktiválta, újraaktiválhatja azt az időtartam leteltét követően.
A 20.7. Példa meghatározza a HTTP.get () függvényt, amely bemutatja a korábban ismertetett időzítő szervezetet. Ez egy változata usover_ shenstvovannuyu HTTP.getText () függvény példa 20.2 és támogatja számos jellemzője bizonyította az előző példákban, vklyu_ tea feldolgozása során hiba történt a kérés paraméterei és HTTP._getResponse () metódus opisan_ ny felett. Ezen kívül, lehetővé teszi, hogy meghatározza egy opcionális visszahívó függvény, hogy fogják hívni, amikor pro_ izoydet onreadystatechange esemény értékét a readyState ingatlan kivételével 4. Ilyen böngészők a Firefox, az eseménykezelő is vyzyvat_ Xia többször értéke 3, és ez a visszahívási funkció lehetővé teszi a szkript számára a felhasználónak egy haladó sáv jelzőjét.
20.7. Példa. A helper függvény HTTP.get ()
* HTTP_ kérés küldése GET-nek a megadott URL-lel. Ha sikeres
* válasz érkezik, a fejléc alapján objektumgá alakul
* Content_Type és átadta a megadott visszahívási funkciónak.
* A kiegészítő objektumok attribútum tulajdonságaihoz hozzáadhatók további érvek.
* Ha hibaüzenetet kap (például egy üzenetet)
* 404 Not Found), az állapotkódot és az üzenetet átadják a függvénynek
* options.errorHandler. Ha a hibakezelő nincs meghatározva, akkor hívják
* visszahívási funkció null értékkel az argumentumban.
* Ha a options.parameters objektum definiálva van, akkor annak tulajdonságai értelmezésre kerülnek
* a lekérdezési paraméterek nevei és értékei. A HTTP.encodeFormData ()
* azok a karakterláncokká alakulnak, amelyek beilleszthetők az URL-be, majd ezt követően
* a karakterlánc a '?' karakter után az URL végére kerül.
* Ha a options.progressHandler függvényt definiálták, akkor hívják
* ha a readyState tulajdonság új értéket ér el, kevesebb mint 4.
* Minden egyes alkalommal, amikor ezt a funkciót áthelyezik, a hívások száma erre a funkcióra.
* Ha megadja a options.timeout értékét, akkor az XMLHttpRequest objektum működése lesz
* megszakadt, ha a kérés nem hajtódik végre a meghatározott milliszekundumszám lejártáig.
* Ha az időkorlát lejárt és a funkciót meghatározták
* options.timeoutHandler, akkor egy stringgel fog hívni
* Kérje az URL-t argumentumként.
HTTP.get = függvény (url, visszahívás, opciók)
var n = 0; var timer;