Bir Ajax isteği tampon nasıl?

3 Cevap php

Ben basit bir ajax işlevi, böyle bir şey var:

var x;
var myRequest = new Array();

function CreateXmlHttpReq(handler) {
    var xmlhttp = null;
    try {
        xmlhttp = new XMLHttpRequest();
    }catch(e){
        try{
                xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
        }catch(e){
                xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
        }
    }
    xmlhttp.onreadystatechange = handler;
    return xmlhttp;
}

function getResults(){
    var r = Math.random();
    var someVar = document.getElementById('myvar').value;
    var myUrl = 'url/of/my/phpScript.php?';
    myUrl += 'r=' + r;
    //encodeURIComponent() instead of escape() when i aspect normal text
    myUrl += '&someVar=' + escape(someVar);
    //startLoading just show an overlay with a small rotating gif
    startLoading();
    x++;
    myRequest[x] = CreateXmlHttpReq(function() {printResultHandler(x)});
    myRequest[x].open("GET", myUrl);
    myRequest[x].send(null);
}

//example handler
function printResultHandler(x) {
    if(myRequest[x].readyState == 4 && myRequest[x].status == 200){
        //usually i use innerHTML for quick requests, the DOM for more complex req
        document.getElementById(div).innerHTML = myRequest[x].responseText;
        //this will hide the overlay showed ith startLoading()
        stopLoading();
    }
}
12345678901234567890123456789012345678901234567890123456789012345678901234567890

and that works fine. I just have some problems when the return flux is big (it can be xml, html, or whatever), the browser seem to 'fall asleep' for a while. I don't like to have a big amount of text (xml, html) all in one. It isn't nice to handle that.

I'm wondering if there exists some way to buffer that request. When the request is done and returns the 200 status, is there a way to get the responseText piece by piece (lets say 2048 bytes, or line by line)? I suppose something like:

function printResultHandler(x) {
    if(myRequest[x].readyState == 4 && myRequest[x].status == 200){
        //usually i use innerHTML for quick requests, the DOM for more complex req
        //document.getElementById(div).innerHTML = myRequest[x].responseText;
        var answer;
        while(answer = readline(myRequest[x].responseText)){
            //to something;
        }
        //this will hide the overlay showed ith startLoading()
        stopLoading();
    }
}

Kısacası, php readdir () veya fread () eşdeğer.

3 Cevap

Anlaştık, bir isteği tampon gerçekten yapabileceği bir şey değildir.

Sen, HTTP istekleri kümesi üzerinde veri için bir kullanıcı isteği şaşırtıcı ayrıştırma ve geri geliyor gibi her HTTP isteği işlerken düşünebilirsiniz.

Kullanıcı 1000 kayıtları 1 istemek isterse Örneğin, müşteri, ilk istek kayıtlarının 1 ila 100, süreç olabilir ayrıştırmak ve işlemek, o zaman üzerinde 200 ve 101 kayıtları isteyin. Ilk 100 kayıtları nispeten hızlı bir şekilde gösterecek ve kısa bir süre sonra, bir sonraki 100 kayıtları görüntülemek istiyorsunuz. Bu yüzden uzun ikinci 100 öncesi görüntüler kaydeder gibi kullanıcı ok olmalıdır ilk 100 kayıt ile başa çıkmak için başardı. Isteği tamamlamak için genel zaman ancak web uygulaması daha duyarlı görünür ve algılanan görev tamamlama süresi düşük olacaktır, daha uzun olacaktır.

Ayrıca sadece veri ile bir elemanın innerHTML özelliğini güncelliyoruz değilseniz JSON XML geçiş düşünmelisiniz.

Kullanıcıya bir AJAX isteğine yanıt görüntülemek için, yanıt önce bir veri yapısı halinde ayrıştırılır ve daha sonra işlenmiş olması gerekir. Şaşırtıcı, XML ve JSON hem ayrıştırma zaman hemen hemen aynıdır. Aradaki fark, elde edilen veri yapısının çapraz ve okumak için gerekli olan zaman içinde yatmaktadır.

Bir çözümlü yanıt DOM içindeki verileri geçme ve bunlara erişmek için arama fonksiyonları nispeten yavaştır. Tarayıcı DOM API yöntemleri geçme DOM katılan ve yavaş bir süreçtir güzel ve basit görünmesi şeyin karmaşıklığını maske.

JSON biçimli bir yanıt ayrıştırma kaynaklanan JavaScript nesnelerinin veri erişim çok daha hızlıdır. JavaScript nesnesine geçme veri aynı seti için bir DOM ağacı geçme daha kolay 2 veya 3 kat daha hızlıdır.

Son testlerde ben bir XML yanıt DOM geçme, kaynak verilerin 10Mb kullanarak Firefox 3.1 beta 2 ile yürütülen yaklaşık 30 saniye sürdü. Aynı orijinal büyük veri setinden doldurulan bir JavaScript nesnesi için aynı şeyi yaklaşık 15 saniye sürdü.

Hayır, isteği tampon yolu yoktur. Eğer veri büyük miktarda dönmek ve o zaman tüm bu ayrıştırılması için uzun bir zaman alacaktır seferde sayfanın içine tüm eklemek için deneyin.

İstediğiniz sonuçları almak için başka bir yolu olup olmadığını düşünebilirsiniz .. Eğer bir AJAX isteği ile sayfaya veri gibi büyük miktarda eklemek zorunda nedeni var mı?

Sen (aka Kendiniz için kod) elle yapmak zorunda.

Kolay bir çözüm aşağıdaki (C = istemci, S = server)

  • Isteği göndermek C
  • S bütün çıkış hazırlamak
  • S verileri tanıtıcı anahtar bir tür (örneğin verilerin MD5) üretir
  • S parçalar halinde veri inci keser ve onları kurtarır (ve öbek sayısını belirlemek)
  • S veri tanımlayıcı döndürür (ve belki öbek sayısı)
  • Son ilk yığın gelen C dolaşır, sunucuyu veri anahtarı (ve yığın numarası) gönderir
  • S istenen yığın döndürür
  • C öbek görüntüler (ya da bir içerik ilerleme çubuğu yükleniyor)

Ihtar ilerleme çubuğu yolda gitmek yerine instand işlem yoksa, o zaman S C. tarafından işlenebilen ne kod olarak kısmen doğru parçalar parçalar halinde veri kesmek zorunda olduğunu