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;