jQuery, 간단한 폴링 예제


105

저는 jQuery를 배우고 있으며 조건에 대해 API를 폴링하는 간단한 코드 예제를 찾으려고합니다. (즉, 몇 초마다 웹 페이지를 요청하고 결과를 처리합니다.)

jQuery에서 AJAX를 수행하는 방법에 대해 잘 알고 있습니다. "타이머"에서 실행하는 "적절한"방법을 찾지 못하는 것 같습니다.

답변:


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

4
어떤 사람들은 사용 setTimeout했고 어떤 사람들은 setInterval. 왜 하나가 다른 사람보다 선호됩니까?
Mike

36
setinterval은 무슨 일이 있어도 5 초마다 ajax 호출을합니다. 작성한 방식 (내가 좋은 습관이라고 생각)은 결과를 기다린 다음 5 초 후에 다른 ajax 요청을합니다. setinterval을 사용할 때가 있지만 이것은 그중 하나가 아닙니다. 우리가 마지막 요청의 결과를 얻을 때까지 우리는 새로운 요청을하지 않아야
조니 크레이그을

107
제안 된 코드는 단일 요청이 실패 할 경우 폴링을 중지합니다. 일반적인 시나리오에서는 어쨌든 폴링을 계속하고 싶을 것입니다. 나는 성공 핸들러setTimeout 안에 가지지 않고 대신 항상 jQuery 와 함께 ajax 호출을 연결합니다 . 다음과 같이 : $.post('ajax/test.html') .done(function(data) { /* process */ }) .always(function() { setTimeout(doPoll, 5000); });
Mårten Wikström

6
테일 콜 최적화가 없습니다. 이것은 함수 호출 스택을 계속 증가시킬 것입니다. 트램폴린 패턴 사용을 권장합니다.
Boopathi Rajaa

8
@BoopathiRajaa는 그러한 트램폴린 패턴의 예를 제공하십시오.
산타

60

다음은 jQuery를 사용한 긴 폴링 (장기 유지 HTTP 요청) 대한 유용한 기사입니다 . 이 기사에서 파생 된 코드 조각 :

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

이것은 ajax 요청이 완료된 후에 만 ​​다음 요청을 만듭니다.

대기 / 시간 초과 간격을 적용하기 전에 처음 호출 될 때 즉시 실행되는 위의 변형입니다.

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

폴링을 취소하거나 중지하도록 신호를 보내는 방법이 있습니까?
Tal

서버에서 예상 한 결과를 얻은 경우 시간 초과를 어떻게 지우나요?
abhishek77in

다음 예와 같이 시간 초과를 지울 수 있습니다.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
위의 techoctave.com 링크를 클릭하지 마십시오. 모든 종류의 불쾌한 일을 시도
Siddharth Ram

13

ES6에서

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);
  • 재귀를 사용하지 않습니다 (함수 스택은 영향을받지 않음).
  • setTimeout-recursion이 tail-call 최적화가 필요한 곳에서 어려움을 겪지 않습니다.

ES6 솔루션을 만나서 반갑습니다!
PHearst

ES6 솔루션 인 Boopathi Rajaa, setInterval ()은 무엇입니까?
Halil

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

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

3
참고 :이 구문을 사용할 수 있습니다setInterval(poll, 5000);
R3tep

7
function make_call()
{
  // do the request

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

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

2

jQuery.Deferred () 는 비동기 시퀀싱 및 오류 처리 관리를 단순화 할 수 있습니다.

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
    }

이것은 우아한 접근 방식이지만 몇 가지 문제가 있습니다 ...

  • a then()가 즉시 넘어 가지 않도록 하려면 콜백이 다른 thenable 객체 (아마도 another Deferred)를 반환해야합니다.이 객체 는 sleep 및 ajax 라인이 모두 수행합니다.
  • 다른 사람들은 인정하기에는 너무 창피합니다. :)


내 "반복 재귀"주석은 약간 오해의 소지가있을 수 있습니다. "재귀"호출이 익명 콜백에서 발생하기 때문에 여기에는 실제 재귀가 없습니다 initiate_polling.
Brent Bradburn

최신 브라우저에서는 더 이상 jQuery가 필요하지 않습니다. 여기에서 내 대답을 참조하십시오. stackoverflow.com/a/48728503/86967
Brent Bradburn

순수 JavaScript 시간 초과 :new Promise( resolve => setTimeout(resolve,1000) ).then( () => alert("done") )
Brent Bradburn

비동기 재귀되어 반복
브렌트 Bradburn

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);
})();


0

이 솔루션 :

  1. 시간 초과 있음
  2. 폴링은 오류 응답 후에도 작동합니다.

jQuery의 최소 버전은 1.12입니다.

$(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()
})
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.