【问题标题】:How can I use AJAX to fetch data and store it in javascript variables?如何使用 AJAX 获取数据并将其存储在 javascript 变量中?
【发布时间】:2011-12-20 03:43:14
【问题描述】:

这是一个动态更新图表示例: http://www.highcharts.com/demo/dynamic-update

图表每秒更新一次,x 值为日期,y 值为随机数。

load: function() {            
    // set up the updating of the chart each second
    var series = this.series[0];
    setInterval(function() {
        var x = (new Date()).getTime(), // current time
            y = Math.random();
        series.addPoint([x, y], true, true);
    }, 1000);
}

如何重写 load 以使用 AJAX 从另一个网页获取 xy,而不是在函数中生成值?

【问题讨论】:

标签: php jquery ajax


【解决方案1】:

我认为您想要的是示例 load 方法,但将设置 xy 的行替换为 AJAX 调用。您需要执行一个相当基本的continuation-passing 代码转换,将您想要异步调用的点之后的代码转换为传递给异步调用的函数。 “Continuation”仅表示“从给定点向前计算的其余部分”。在代码示例中,这是对series.addPoint 的调用。这个模式是你转换:

function f(...) {
    (1)
    result = sync(...);
    (2)
}

进入:

function f(...) {
    (1)
    async(..., function (result) {
          (2)
      });
}

如果 (2) 在原始函数中返回一个值,那么对 f 的调用也必须使用延续传递样式重写,添加一个额外的参数来保存延续。

您应该做的另一件事是确保 PHP 脚本将数字对输出为有效的 JSON,或者作为两个数字的数组(可以在解析后直接传递给 series.addPoint 调用),或者作为一个对象具有“x”和“y”属性。

请注意,由于网络通信的性质,数据可能无法及时到达,从而导致图表的间隔不规则。

这里是要点,将异步调用的具体细节封装到一个名为ajaj 的函数中。该示例假定浏览器支持XMLHttpRequestJSON 解析器的必要标准。

/* Asynchronous Javascript And Json */
function ajaj(url, succeed, fail) {
    if (! fail) {
        fail = function() {};
    }
    var xhr = new XMLHttpRequest;
    xhr.open('GET', url);
    xhr.onreadystatechange = function() {
        if (xhr.readyState==4) {
            if (200 <= xhr.status && xhr.status < 300) {
                succeed(JSON.parse(xhr.responseText));
            } else {
                // error
                fail(xhr.status, xhr.statusText, xhr.responseText);
            }
        }
    };
    xhr.send();
    return xhr;
}

...

    url: '...',

    load: function() {
        // ensure only one data load interval is running for this object
        if (this.updateInterval) {
            return;
        }
        // set up the updating of the chart each second
        var series = this.series[0];

        this.updateInterval = setInterval(function() {
            ajaj(this.url, 
                 function(point) { // success
                     series.addPoint(point, true, true);
                 },
                 function(status, statusText, response) { // failure
                     ...
                 }
            );
        }, 1000);
    }

JS 库提供自己的ajaj 版本,通常具有更多功能。如果您正在为生产站点做任何复杂的事情,请考虑采用一个。如果您使用 jQuery(如标签所示),例如,您可以使用 jQuery.get:

    load: function() {
        if (this.updateInterval) {
            return;
        }
        // set up the updating of the chart each second
        var series = this.series[0];

        this.updateInterval = setInterval(function() {
            jQuery.get(this.url, 
                 function(point, textStatus, jqXHR) { // success
                     series.addPoint(point, true, true);
                 }, 'json'
            );
        }, 1000);
    }

服务器端非常简单。 time() 返回一个 Unix 时间戳,rand() 返回一个(不是很)伪随机数(虽然对于演示来说已经足够好了),json_encode(),嗯,你可以弄清楚。

<?php
header('Content-type: application/json');

echo json_encode(
        array(
            time(),
            rand() / getrandmax(),
        ));

【讨论】:

    【解决方案2】:

    我想你想递归调用setTimeout

    function update(series){
        var x = (new Date()).getTime(), // current time
            y = Math.random();
        series.addPoint([x, y], true, true);
        setTimeout(function() { update(series); }, 1000);
    }
    

    然后:

    load: function() {            
        var series = this.series[0];
        update(series);
    }
    

    或者更好的是,试试这样的:

    function update(){
        var series = yourChart.series[0];
        var x = (new Date()).getTime(), // current time
            y = Math.random();
        series.addPoint([x, y], true, true);
        setTimeout(update, 1000);
    }
    

    然后:

    load: update
    

    编辑

    如果你想得到一个随机数作为整数,应该这样做(取决于你想要的数字的范围)

    Math.floor(Math.random() * 10)
    

    random 将返回 [0, 1) 范围内的数字,而 floor 将去掉所有小数点。

    random docs

    【讨论】:

    • 对不起,这不是我要找的。我需要代码来每秒动态设置 x 和 y 的值。我真正需要看到的是如何发送请求并将响应保存为 x 或 y 为 int
    • @user475160 亚当似乎有一个很好的方法;请记住,只要您使用 Ajax(以及 setTimeout),问题的“每一秒”部分充其量只是一个估计值。网络条件和 setTimeout 的性质将使精确到秒的任务成为不可能的任务。
    • 你们俩都不明白我在做什么
    • 我正在尝试用我自己的值替换 x 和 y,使用对服务器的 AJAX 请求。实现的代码不使用 AJAX。您的建议代码未使用 AJAX。我对随机数不感兴趣。我不需要 setTimeout 函数。我需要一个调用服务器的 AJAX 函数,请求两个值。并将它们存储在 X 和 Y 中。换句话说,x = 对我服务器上 php 文件的请求的响应,y = 对我服务器上 php 文件的 AJAX 请求的响应
    • @user475160 - 看起来 outis 已经给了你一个很好的答案
    猜你喜欢
    • 2021-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-27
    • 1970-01-01
    • 2014-01-03
    • 2021-06-26
    • 1970-01-01
    相关资源
    最近更新 更多