3

我正在使用dojo.xhrPost发送 Ajax
请求function sendRequest()

我现在必须连续(每 3 秒)向服务器发送相同的 ajax Post
如何使用 Dojo 实现服务器轮询?我基本上需要sendRequest()每 3 秒打一次电话

4

3 回答 3

3

我不相信 Dojo 有内置的轮询方法,所以这里有一个适用于跨框架的通用方法

var Poll = function(pollFunction, intervalTime) {
    var intervalId = null;

    this.start = function(newPollFunction, newIntervalTime) {
        pollFunction = newPollFunction || pollFunction;
        intervalTime = newIntervalTime || intervalTime;

        if ( intervalId ) {
            this.stop();
        }

        intervalId = setInterval(pollFunction, intervalTime);
    };

    this.stop = function() {
        clearInterval(intervalId);
    };
};

用法:

var p = new Poll(function() { console.log("hi!"); }, 1000);
p.start();
setTimeout(function() { p.stop();}, 5000);

或者在你的情况下:

var p = new Poll(sendRequest, 3000);
p.start();

如果你想把它作为一个 Dojo 包,那么下面是一个简单的扩展:

dojo.provide("Poll");

dojo.declare("Poll", null, {
    intervalId:   null,
    pollFunction: null,
    intervalTime: null,

    constructor: function(newPollFunction, newIntervalTime) {
        this.pollFunction = newPollFunction;
        this.intervalTime = newIntervalTime;
    },

    start: function(newPollFunction, newIntervalTime) {
        this.pollFunction = newPollFunction || this.pollFunction;
        this.intervalTime = newIntervalTime || this.intervalTime;

        this.stop();
        this.intervalId = setInterval(this.pollFunction, this.intervalTime);
    },

    stop: function() {
        clearInterval(this.intervalId);
    }
});

用法:

var p = new Poll(function() {console.log("hi");}, 250);
p.start();
setTimeout(dojo.hitch(p, p.stop), 1000);
于 2010-03-16T16:09:18.183 回答
0

我发现这样做更好:

  1. 有一个包含空数组(队列)的变量
  2. setInterval 进行轮询,在每次轮询时,将一个新对象(带有轮询参数)推送到数组(队列)中;您还可以通过将具有相同参数的对象折叠到一个对象中来压缩民意调查;你甚至可以将处理函数放入这些对象中
  3. 有一个计时器来检查队列;如果没有,返回
  4. 如果队列中有一个待处理的对象,检查是否已经有一个未返回的待处理 xhr 操作,只需等待——你不希望同时有太多的 xhr 待处理,某些设备(例如 iPad)会阻塞它
  5. 如果没有待处理的 xhr 操作,则将第一个 poll 对象出列并 xhr 获取它

此过程的好处是您可以轻松限制轮询间隔,在某些 xhr 操作超时时工作正常,并且可以轻松实现轮询请求的私有化。

于 2011-03-10T14:22:41.067 回答
0

要不断更新您的网格,您可以在网格的“刷新完成”回调函数中包含您的 ajax 请求。

yourGrid.on('dgrid-refresh-complete', function(event) { 

//Ajax request fireing every 3 sec


}
于 2014-10-25T21:14:31.910 回答