为什么我的JavaScript函数没有填充我的数组?

时间:2011-09-11 11:43:30

标签: javascript jquery

以下代码块成功返回数组值(编号1 130879253000,34756)

    function getCsv(file_name){
        var array_holder = [];
        $.get(file_name, function(csv, state, xhr) {

            // inconsistency
            if (typeof csv != 'string') {
                csv = xhr.responseText;
            }

            // parse the CSV trades
            var header, comment = /^#/, x;

            $.each(csv.split('\n'), function(i, line){
                if (!comment.test(line)) {
                    if (!header) {
                        header = line;
                    }
                    else {
                        var point = line.split(';'),
                            date = point[0].split('-'),
                            time = point[1].split(':');

                        if (point.length > 1) {
                            x = Date.UTC(date[2], date[1] - 1, date[0], time[2], time[1], time[0]);

                            array_holder.push([
                                x, // time
                                parseFloat(point[2]) // close
                            ]);
                        }
                    }
                }

            }); // each
            alert('No. 1' + array_holder[0]);
        });
        return array_holder;
    }

在下面的代码部分中,我试图调用getCsv,但我得到的是未定义的#2

$(function() {

        var trades  = getCsv('trades.csv');
        var spreads = getCsv('spreads.csv');
        alert('No. 2' + trades[0]);
}

为什么我的数组没有填充?在实际代码中,我按照此处列出的顺序将上述两个函数紧挨着。因此,文件正确读取,就像array_holder超出范围并被垃圾收集一样。

2 个答案:

答案 0 :(得分:9)

这是由于$.get()的异步性质造成的。在您执行警报时,AJAX请求尚未运行。

在请求的成功回调中进行警报,其中发生“No.1”警报。

答案 1 :(得分:2)

$.get()是异步的。因此,您作为第二个参数编写的函数不会被调用,直到加载文件,然后在您的成功函数执行之前到达return函数的getCsv,这就是数组为空的原因。 请参阅此讨论的答案以获得解决方案:
How can I get jQuery to perform a synchronous, rather than asynchronous, Ajax request?