jQuery, basit yoklama örneği


105

JQuery öğreniyorum ve bir koşul için bir API'yi sorgulayacak basit bir kod örneği bulmaya çalışıyorum. (yani, birkaç saniyede bir web sayfası isteyin ve sonuçları işleyin)

JQuery'de AJAX'ın nasıl yapıldığına aşinayım, onu bir "zamanlayıcı" üzerinde çalıştırmanın "doğru" yolunu bulamıyorum.

Yanıtlar:


140
function doPoll(){
    $.post('ajax/test.html', function(data) {
        alert(data);  // process results here
        setTimeout(doPoll,5000);
    });
}

4
bazı insanlar kullandı setTimeoutve bazıları kullandı setInterval. Neden biri diğerine tercih edilir?
Mike

36
setinterval, ne olursa olsun her 5 saniyede bir ajax çağrısı yapar. Yazılan yol (iyi bir uygulama olduğuna inanıyorum) sonuçları bekleyecek SONRA 5 saniye sonra başka bir ajax isteğinde bulunacak. setinterval kullanacağım zamanlar var ama bu onlardan biri değil. Son istekten sonuçları alana kadar yeni istekte bulunmamalıyız
Johnny Craig

108
Lütfen tek bir istek başarısız olursa önerilen kodun yoklamayı durduracağına dikkat edin. Tipik bir senaryoda, muhtemelen oylamaya devam etmek istersiniz. Başarı işleyicide olmazdım setTimeout, bunun yerine ajax çağrısını her zaman jQuery ile zincirleyin . $.post('ajax/test.html') .done(function(data) { /* process */ }) .always(function() { setTimeout(doPoll, 5000); });
Şunun

6
Kuyruk arama optimizasyonu yoktur. Bu sadece fonksiyon çağrı yığınını artırmaya devam edecektir. Trambolin deseninin kullanılması tavsiye edilir.
Boopathi Rajaa

8
@BoopathiRajaa lütfen böyle bir trambolin modeli örneği verin.
santa

61

İşte jQuery kullanarak uzun yoklama (uzun süre tutulan HTTP isteği) hakkında yararlı bir makale . Bu makaleden türetilen bir kod parçacığı:

(function poll() {
    setTimeout(function() {
        $.ajax({
            url: "/server/api/function",
            type: "GET",
            success: function(data) {
                console.log("polling");
            },
            dataType: "json",
            complete: poll,
            timeout: 2000
        })
    }, 5000);
})();

Bu, sonraki isteği yalnızca ajax isteği tamamlandıktan sonra yapacaktır.

Bekleme / zaman aşımı aralığına uyulmadan önce ilk çağrıldığında hemen çalıştırılacak olan yukarıdaki varyasyon.

(function poll() {
    $.ajax({
        url: "/server/api/function",
        type: "GET",
        success: function(data) {
            console.log("polling");
        },
        dataType: "json",
        complete: setTimeout(function() {poll()}, 5000),
        timeout: 2000
    })
})();

Yoklamayı iptal etmenin veya durdurması için sinyal vermenin bir yolu var mı?
Tal

Sunucudan beklenen sonuç alınırsa zaman aşımını nasıl temizlerim?
abhishek77in

Zaman aşımını aşağıdaki örnekte olduğu gibi temizleyebilirsiniz:let is_success = false; (function poll() { let timeout = setTimeout(function() { $.ajax({ url: resp.location, type: "GET", success: function(data) { if(YOUR_CONDITION) { is_success=true; } }, dataType: "json", complete: poll, timeout: 2000 }) }, 5000); if(is_success) { console.log("ending poll"); window.clearTimeout(timeout); } })();
Marius

2
Yukarıdaki techoctave.com bağlantısına tıklamayın. Her türden iğrenç şeyi yapmaya çalışır
Siddharth Ram

13

ES6'dan,

var co = require('co');
var $ = require('jQuery');

// because jquery doesn't support Promises/A+ spec
function ajax(opts) {
  return new Promise(function(resolve, reject) {
    $.extend(opts, {
      success: resolve,
      error: reject
    });
    $.ajax(opts);
  }
}

var poll = function() {
  co(function *() {
    return yield ajax({
      url: '/my-api',
      type: 'json',
      method: 'post'
    });
  }).then(function(response) {
    console.log(response);
  }).catch(function(err) {
    console.log(err);
  });
};

setInterval(poll, 5000);
  • Özyineleme kullanmaz (işlev yığını etkilenmez).
  • SetTimeout-recursion'ın tail-call optimize edilmesi gereken yerlerde acı çekmez.

Bir ES6 çözümünü görmek güzel!
PHearst

Onu bir ES6 çözümü yapan Boopathi Rajaa, setInterval () nedir?
Halil

11
function poll(){
    $("ajax.php", function(data){
        //do stuff  
    }); 
}

setInterval(function(){ poll(); }, 5000);

3
Not: Bu sözdizimini kullanabilirsinizsetInterval(poll, 5000);
R3tep

7
function make_call()
{
  // do the request

  setTimeout(function(){ 
    make_call();
  }, 5000);
}

$(document).ready(function() {
  make_call();
});

2

jQuery.Deferred () , eşzamansız sıralama ve hata işlemenin yönetimini basitleştirebilir.

polling_active = true // set false to interrupt polling

function initiate_polling()
    {
    $.Deferred().resolve() // optional boilerplate providing the initial 'then()'
    .then( () => $.Deferred( d=>setTimeout(()=>d.resolve(),5000) ) ) // sleep
    .then( () => $.get('/my-api') ) // initiate AJAX
    .then( response =>
        {
        if ( JSON.parse(response).my_result == my_target ) polling_active = false
        if ( ...unhappy... ) return $.Deferred().reject("unhappy") // abort
        if ( polling_active ) initiate_polling() // iterative recursion
        })
    .fail( r => { polling_active=false, alert('failed: '+r) } ) // report errors
    }

Bu zarif bir yaklaşım, ancak bazı sorunlar var ...

  • A'nınthen() hemen düşmesini istemiyorsanız , geri arama , hem sleep hem de ajax satırlarının yaptığı başka bir uygun nesneyi (muhtemelen başka bir Deferred) döndürmelidir .
  • Diğerleri kabul edilemeyecek kadar utanç verici. :)


"Yinelemeli özyineleme" yorumum biraz yanıltıcı olabilir. "Özyinelemeli" çağrı, anonim bir geri aramadan - initiate_pollingçalıştırıldıktan sonra tamamlanana kadar - gerçekleştiğinden, burada gerçek bir özyineleme yoktur .
Brent Bradburn

En son tarayıcılarda, artık
jQuery'nin

Saf JavaScript zaman aşımı:new Promise( resolve => setTimeout(resolve,1000) ).then( () => alert("done") )
Brent Bradburn

Async Recursion Is Iteration
Brent Bradburn

1

Bu çözüm:

  1. zaman aşımı var
  2. yoklama, hata yanıtından sonra da çalışır

Minimum jQuery sürümü 1.12'dir

$(document).ready(function () {
  function poll () {
    $.get({
      url: '/api/stream/',
      success: function (data) {
        console.log(data)
      },
      timeout: 10000                    // == 10 seconds timeout
    }).always(function () {
      setTimeout(poll, 30000)           // == 30 seconds polling period
    })
  }

  // start polling
  poll()
})

0
(function poll() {
    setTimeout(function() {
        //
        var search = {}
        search["ssn"] = "831-33-6049";
        search["first"] = "Harve";
        search["last"] = "Veum";
        search["gender"] = "M";
        search["street"] = "5017 Ottis Tunnel Apt. 176";
        search["city"] = "Shamrock";
        search["state"] = "OK";
        search["zip"] = "74068";
        search["lat"] = "35.9124";
        search["long"] = "-96.578";
        search["city_pop"] = "111";
        search["job"] = "Higher education careers adviser";
        search["dob"] = "1995-08-14";
        search["acct_num"] = "11220423";
        search["profile"] = "millenials.json";
        search["transnum"] = "9999999";
        search["transdate"] = $("#datepicker").val();
        search["category"] = $("#category").val();
        search["amt"] = $("#amt").val();
        search["row_key"] = "831-33-6049_9999999";



        $.ajax({
            type : "POST",
            headers : {
                contentType : "application/json"
            },
            contentType : "application/json",
            url : "/stream_more",
            data : JSON.stringify(search),
            dataType : 'json',
            complete : poll,
            cache : false,
            timeout : 600000,
            success : function(data) {
                //
                //alert('jax')
                console.log("SUCCESS : ", data);
                //$("#btn-search").prop("disabled", false);
                // $('#feedback').html("");
                for (var i = 0; i < data.length; i++) {
                    //
                    $('#feedback').prepend(
                            '<tr><td>' + data[i].ssn + '</td><td>'
                                    + data[i].transdate + '</td><td>'
                                    + data[i].category + '</td><td>'
                                    + data[i].amt + '</td><td>'
                                    + data[i].purch_prob + '</td><td>'
                                    + data[i].offer + '</td></tr>').html();
                }

            },
            error : function(e) {
                //alert("error" + e);

                var json = "<h4>Ajax Response</h4><pre>" + e.responseText
                        + "</pre>";
                $('#feedback').html(json);

                console.log("ERROR : ", e);
                $("#btn-search").prop("disabled", false);

            }
        });

    }, 3000);
})();

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.