Nasıl jQuery $. Ajax çağrıları tamamladıktan olsun zaman bilmek?

3 Cevap php

Ben çeşitli API'leri 13 ajax sorguları yapar ve bir veritabanı tablosundaki sonucu depolayan bir PHP / MySQL / jquery web uygulaması var. Her sonuç için bir puan atamak ve tüm sonuçlar tamamladıktan sonra ben bir 'toplam puanı' göstermek istiyorum.

Benim sorunum bütün ajax sorguları tamamlanan ve tüm sonuçlar ve sayımı için hazır olduğunda bilmektir.

Burada mevcut iş akışı bulunuyor:

  1. Kullanıcı sorgu kutusuna veri girer ve vurur gönderin.
  2. Sayfa reloads ve 'scan_index' tabloya bir 'tarama id' ekler.
  3. Sayfa sonra bir jquery $ yürütür. (Tüm sorgular işlerini gerçekleştirmek için aynı javascript işlevini kullanın) 13 sorgu her fonksiyonu olsun.
  4. Her bir sonuç döndürülür olarak, sonuç uygun tarama ile ilişki sağlamak için, daha önce yerleştirilen "tarama id 'kullanarak bir" taramalar' tablosuna sokulur. Sonuç da bu sonucun puanıyla birlikte kullanıcıya görüntülenir.

Bu noktada ne yapacağını scan_id değerini kullanarak tarar tablodaki tüm sonuçlar almak ve skoru kadar toplam ve kullanıcıya o görüntüler olduğunu.

Ama benim sorunum tüm toplamları almak için sorgu başlaması için zaman bilmektir. Herhangi bir sorgu tamamlayarak (ya da başarısız) önce 10 saniye (benim önceden tanımlanmış zaman aşımı değeri) kadar sürebilir, ancak genellikle tamamlamak için max sadece yaklaşık 3 saniye sürebilir.

Tüm sorguları tamamlandı Yani, bir sorgu işleminin ne zaman bilmeden, nasıl anlayabilirim?

3 Cevap

Eğer eksik bilgi anahtar parça Doları arama işlevselliği gibi geliyor. Olsun. Sen isteği tamamlandığında ateş edecek, ikinci veya üçüncü argüman olarak bir işlev belirtebilirsiniz

$.get('http://example.com/data', {'foo':'bar'}, function(resonseData){
    //code here will be called when the ajax call has completed
})

Yani kurulum için yapılmış her istek için bir kez bir artırılır alır, ve sonra geri arama biri tarafından bu değeri azaltacaktır bir sayaç değişkeni bir yere isteyeceksiniz.

Ardından, son olsun isteği, Kur sayaç sıfır ise (bir kez ikinci, demek) görmek için periyodik kontrol edecek setInterval kullanarak Gözetmenin yaptıktan sonra. Eğer durum bu ise, tüm istekleri ile bitti. Muhtemelen kendini geri arama olsun. $ Için bu denetimi ekleyebilirsiniz, ancak zamanlama sorunları duyarlı olabilir gibi görünüyor.

Bu temel bir çözüm, ama bu kolayca daha sağlam / zarif kuyruk çözeltisi içine soyutlanmış olabilir.

Burada başka bir seçenektir. Kod, tweaked gerekebilir ben aslında test etmedi, ama bu bir başlangıç.

var complete = 0;

function submitRequests () {
    $.get("http://server/query1", {"data": "for Query"}, processResult(1));
    $.get("http://server/query2", {"data": "for Query"}, processResult(2));
    //...
    $.get("http://server/query13", {"data": "for Query"}, processResult(13));
}

function processResults (query) {
    complete += Math.pow(2,(query-1));
    if (complete == 8191) {
    	$.get("http://server/results", scanid, function() {
    		//Show results
    	})
    } 
}

Jquery ajaxStop () yöntemini kullanın

        $(document).ajaxStart(function () {
            //first ajax call started
        });

        $(document).ajaxStop(function () {
            //last ajax call stopped
        });