为什么我的功能在长时间调用时会失败?

时间:2017-03-15 14:08:57

标签: javascript jquery asynchronous

我已经写了一些javascript来从API收集数据,然后在响应中迭代几天将它们解析成行(要导出到CSV但是我已经省略了它,因为它正在工作细)。

我的问题是代码可以在大约10天或12天内正常工作,但除此之外它还会提升:

Uncaught TypeError: Cannot read property 'length' of null

在第for (var i = 0; i < items.length; i++) {

我认为这与我在需要解析结果时未完成的jquery.get()调用有关,但我不知道应该如何正确地执行此操作。有人能指出我正确的方向吗?

<!DOCTYPE html>
<html>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
    <script src="https://code.jquery.com/ui/1.9.2/jquery-ui.js"></script>
<head>
    <title></title>
</head>
<body>
Start:<br>
<input type="text" id="startdate" value="2016-04-12" /><br>
End:<br>
<input type="text" id="enddate" value="2016-04-12" /><br>
<br>
<input type="submit" id="downloadBtn" value="Fetch data"/>
<script>
    var startDate;
    var endDate;  
    var fileName;
    var headers = ["date","time","obs1", "obs2"]
    var rows = [headers];

    $("#downloadBtn").click(function() {
        startDate = document.getElementById("startdate").value.split("-").join("");
        endDate = document.getElementById("enddate").value.split("-").join("");  
        url = "https://api.example" + startDate + endDate + ".json";
        fetchData( url );
    });

    function fetchData( url ) {
        event.preventDefault();
        $.get( url, parseRecords );
    }

    // Extract all data from a query response
    function parseRecords(data, status) {
        var days = data.historic.days;
        for (var i = 0; i < days.length; i++) {
            dayRows = formatDay( days[i] );
            for (var j= 0; j < dayRows.length; j++) {
                rows.push(dayRows[j]);
            }
        }
    }

    // Extract row data
    function formatDay ( day ) {
        var dayRows = [];
        var date = day.iso8601.slice(0, 10);
        var items = day.items;
        // error is raised on the following line, but only for larger responses
        for (var i = 0; i < items.length; i++) { 
            var row = [];
            var item = items[i];
            row.push([date]);
            row.push([item.obs1]);
            row.push([item.obs2]);
            dayRows.push(row);
        }    
        return dayRows;
    }

    </script>
</body>
</html>

1 个答案:

答案 0 :(得分:0)

我认为您的代码继续正常运行,但每10-12天服务器响应失败。但是,您的代码只期望并处理来自服务器的成功响应 - 因此,如果它返回某种错误,您的代码会在获得正常数据时愉快地插入,但是当它没有预期的输入时会窒息。我建议您在sed 'N;s/\n[0-9]//;s/,/ /2g' file 上链接sed ':a;N;s/^\([0-9][0-9]*\)\(.*\) *\n\1,/\1\2 /;ta;P;D;' file 处理程序。