jQuery,简单的轮询示例

Mik*_*ike 97 jquery polling

我正在学习jQuery,我正在尝试找到一个简单的代码示例,它将针对某个条件轮询API.(即每隔几秒请求一个网页并处理结果)

我熟悉如何在jQuery中使用AJAX,我似乎无法找到让它在"计时器"上执行的"正确"方式.

Joh*_*aig 132

function doPoll(){
    $.post('ajax/test.html', function(data) {
        alert(data);  // process results here
        setTimeout(doPoll,5000);
    });
}
Run Code Online (Sandbox Code Playgroud)

  • 请注意,如果单个请求失败,建议的代码将停止轮询.在典型情况下,您可能希望继续进行轮询.我不会在*success handler*中使用`setTimeout`,而是使用[jQuery always]链接ajax调用(http://api.jquery.com/deferred.always/).像这样:`$ .post('ajax/test.html').done(function(data){/*process*/}).allways(function(){setTimeout(doPoll,5000);});` (99认同)
  • 无论怎样,setinterval都会每隔5秒进行一次ajax调用.写它的方式(我认为这是好的做法)将等待结果,然后5秒后再做一个ajax请求.有时我会使用setinterval,但这不是其中之一.在得到上一个请求的结果之前,我们不应该发出任何新请求 (36认同)
  • @BoopathiRajaa请提供一个这样的蹦床模式的例子. (7认同)
  • 没有尾调用优化.这只会不断增加函数调用堆栈.建议使用蹦床模式. (6认同)
  • 有些人使用`setTimeout`,有些人使用`setInterval`.为什么一个人更喜欢另一个? (4认同)
  • 当前浏览器的调用堆栈限制非常高,这不应该是任何人的担忧.iE具有最低限制,您仍然可以每隔五秒轮询一次服务器超过24小时而无需刷新页面.如果这还不够,那么轮询不是您需求的解决方案. (4认同)
  • 但是,您的轮询是否会受到堆栈大小的限制这一事实不足以让使用递归变得不好? (2认同)

chr*_*leu 58

这是一篇关于使用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);
})();
Run Code Online (Sandbox Code Playgroud)

这将仅在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
    })
})();
Run Code Online (Sandbox Code Playgroud)

  • 请勿点击上面的 techoctave.com 链接。试图做各种令人讨厌的事情 (5认同)

Boo*_*jaa 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);
Run Code Online (Sandbox Code Playgroud)
  • 不使用递归(函数堆栈不受影响).
  • 在setTimeout-recursion需要尾调用优化的情况下不会受到影响.


gen*_*sis 11

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

setInterval(function(){ poll(); }, 5000);
Run Code Online (Sandbox Code Playgroud)

  • 注意:您可以使用此语法`setInterval(poll,5000);` (3认同)

Pee*_*Haa 7

function make_call()
{
  // do the request

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

$(document).ready(function() {
  make_call();
});
Run Code Online (Sandbox Code Playgroud)