jQuery, ví dụ bỏ phiếu đơn giản


105

Tôi đang học jQuery và tôi đang cố gắng tìm một ví dụ mã đơn giản sẽ thăm dò một API cho một điều kiện. (tức là, yêu cầu một trang web cứ sau vài giây và xử lý kết quả)

Tôi đã quen với cách thực hiện AJAX trong jQuery, dường như tôi không thể tìm ra cách "thích hợp" để khiến nó thực thi trên một "bộ đếm thời gian".

Câu trả lời:


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

4
một số người đã sử dụng setTimeoutvà một số đã sử dụng setInterval. Tại sao cái này được ưu tiên hơn cái khác?
Mike

36
setinterval sẽ thực hiện một cuộc gọi ajax cứ sau 5 giây bất kể điều gì. cách đã viết nó (mà tôi tin là thực hành tốt) sẽ đợi kết quả SAU ĐÓ thực hiện một yêu cầu ajax khác 5 giây sau. có những lần tôi sẽ sử dụng setinterval, nhưng đây không phải là một trong số chúng. chúng ta không nên thực hiện bất kỳ yêu cầu mới cho đến khi chúng tôi nhận được kết quả từ các yêu cầu cuối cùng
Johnny Craig

107
Vui lòng lưu ý rằng mã đề xuất sẽ ngừng bỏ phiếu nếu một yêu cầu duy nhất không thành công. Trong một trường hợp điển hình, bạn có thể muốn tiếp tục thăm dò ý kiến. Tôi sẽ không có setTimeouttrong trình xử lý thành công mà thay vào đó chuỗi lệnh gọi ajax luôn luôn bằng jQuery . Như thế này: $.post('ajax/test.html') .done(function(data) { /* process */ }) .always(function() { setTimeout(doPoll, 5000); });
Mårten Wikström

6
Không có tối ưu hóa cuộc gọi đuôi. Điều này sẽ tiếp tục tăng ngăn xếp cuộc gọi hàm. Nên sử dụng mô hình tấm bạt lò xo.
Boopathi Rajaa

8
@BoopathiRajaa vui lòng cung cấp một ví dụ về mẫu tấm bạt lò xo như vậy.
santa

60

Đây là một bài viết hữu ích về cách bỏ phiếu dài (yêu cầu HTTP được giữ lâu) bằng cách sử dụng jQuery. Một đoạn mã bắt nguồn từ bài viết này:

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

Thao tác này sẽ chỉ thực hiện yêu cầu tiếp theo sau khi yêu cầu ajax đã hoàn thành.

Một biến thể ở trên sẽ thực thi ngay lần đầu tiên nó được gọi trước khi đáp ứng khoảng thời gian chờ / thời gian chờ.

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

Có cách nào để hủy bỏ phiếu hoặc ra hiệu dừng không?
Tal,

Làm cách nào để xóa thời gian chờ nếu nhận được kết quả mong đợi từ máy chủ?
abhishek77in

Bạn có thể xóa thời gian chờ như trong ví dụ sau: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
Đừng nhấp vào liên kết techoctave.com ở trên. Cố gắng làm tất cả những điều khó chịu
Siddharth Ram

13

Từ 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);
  • Không sử dụng đệ quy (ngăn xếp hàm không bị ảnh hưởng).
  • Không gặp vấn đề khi setTimeout-đệ quy cần được tối ưu hóa cuộc gọi đuôi.

Rất vui khi thấy một giải pháp ES6!
Đầu tiên

Điều gì làm cho nó trở thành giải pháp ES6 Boopathi Rajaa, setInterval ()?
Halil,

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

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

3
Lưu ý: Bạn có thể sử dụng cú pháp nàysetInterval(poll, 5000);
R3tep

7
function make_call()
{
  // do the request

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

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

2

jQuery.Deferred () có thể đơn giản hóa việc quản lý trình tự không đồng bộ và xử lý lỗi.

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
    }

Đây là một cách tiếp cận thanh lịch, nhưng có một số lỗi ...

  • Nếu bạn không muốn a xảy then()ra ngay lập tức, thì lệnh gọi lại sẽ trả về một đối tượng khả thi khác (có thể là đối tượng khác Deferred), mà cả hai dòng sleep và ajax đều thực hiện.
  • Những người khác quá xấu hổ để thừa nhận. :)

Câu trả lời tương tự tại địa chỉ: Hoãn trong một thời gian vòng lặp
Brent Bradburn

Nhận xét "đệ quy lặp lại" của tôi có thể hơi sai lệch. Không có đệ quy thực sự ở đây vì cuộc gọi "đệ quy" xảy ra từ một cuộc gọi lại ẩn danh - sau khi initiate_pollingđã chạy đến khi hoàn thành.
Brent Bradburn

Trong các trình duyệt mới nhất, bạn không cần jQuery làm điều này nữa - hãy xem câu trả lời của tôi tại đây: stackoverflow.com/a/48728503/86967
Brent Bradburn

Thời gian chờ JavaScript thuần túy:new Promise( resolve => setTimeout(resolve,1000) ).then( () => alert("done") )
Brent Bradburn

Đệ quy Async được lặp lại
Brent 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

Giải pháp này:

  1. có thời gian chờ
  2. thăm dò ý kiến ​​cũng hoạt động sau khi phản hồi lỗi

Phiên bản tối thiểu của jQuery là 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()
})
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.