Javascript 如何立即更新从异步FileReader函数初始化的变量?

Javascript 如何立即更新从异步FileReader函数初始化的变量?,javascript,jquery,asynchronous,filereader,Javascript,Jquery,Asynchronous,Filereader,我正在尝试使用FileReader将csv文件的内容保存到变量中。我设法获取了内容并将其保存到变量csvAreas中,但没有立即更新。我尝试过使用回调方法和jquery$.when().then(),但仍然不起作用 test.csv: c1,23.44308893,53.06396484 c2,23.73506919,54.0637207 c3,23.01907619,53.12988281 var csvAreas = []; // other stuff.. function csvI

我正在尝试使用FileReader将csv文件的内容保存到变量中。我设法获取了内容并将其保存到变量csvAreas中,但没有立即更新。我尝试过使用回调方法jquery$.when().then(),但仍然不起作用

test.csv:

c1,23.44308893,53.06396484
c2,23.73506919,54.0637207
c3,23.01907619,53.12988281
var csvAreas = [];

// other stuff..

function csvImport(){
    $.when(csvLoad()).then(drawCSVCoverage());
}

function csvLoad(){
    var file = document.getElementById("csv-file-upload").files[0];

    readFile(file, function(e) {
        var lines = this.result.split('\n');
        for(var line = 0; line < lines.length; line++){
            var cols = lines[line].split(',');
            csvAreas.push([]);
            csvAreas[line].push(cols[1]);
            csvAreas[line].push(cols[2]);
        }
    });
}

function readFile(file, onLoadCallback){
    var reader = new FileReader();
    reader.onload = onLoadCallback;
    reader.readAsText(file);
}

function drawCSVCoverage(){
    alert("Length: " + csvAreas.length) //Length: 0
}
main.js:

c1,23.44308893,53.06396484
c2,23.73506919,54.0637207
c3,23.01907619,53.12988281
var csvAreas = [];

// other stuff..

function csvImport(){
    $.when(csvLoad()).then(drawCSVCoverage());
}

function csvLoad(){
    var file = document.getElementById("csv-file-upload").files[0];

    readFile(file, function(e) {
        var lines = this.result.split('\n');
        for(var line = 0; line < lines.length; line++){
            var cols = lines[line].split(',');
            csvAreas.push([]);
            csvAreas[line].push(cols[1]);
            csvAreas[line].push(cols[2]);
        }
    });
}

function readFile(file, onLoadCallback){
    var reader = new FileReader();
    reader.onload = onLoadCallback;
    reader.readAsText(file);
}

function drawCSVCoverage(){
    alert("Length: " + csvAreas.length) //Length: 0
}

警报是否会导致浏览器更新变量?有没有合适的方法来更新变量

csvLoad
函数必须返回一个
Deferred
对象,以便在
时成为
的合理参数。另外,
then
的参数应该是一个函数;相反,您将立即调用
drawCSVCoverage
,并将返回值传递到
中,然后传递到
。(例如,在
drawCSVCoverage()
上丢失
()
)我猜
drawCSVCoverage()
csvLoad()
完成之前执行。
@Marc我也这么认为。我在执行drawCSVCoverage()之前设置了50毫秒的超时时间,这就解决了这个问题。你认为这是一种合法的方法吗?@CaioCésarS.Leonardi yes在执行DrawCsvOverage和csvLoad之间的50毫秒延迟时间内对其进行了测试,并得出了正确的值。那么,这是执行依赖于先前异步函数的函数的正确方法吗?
csvLoad
函数必须返回一个
Deferred
对象,以便在
时成为
的合理参数。另外,
then
的参数应该是一个函数;相反,您将立即调用
drawCSVCoverage
,并将返回值传递到
中,然后传递到
。(例如,在
drawCSVCoverage()
上丢失
()
)我猜
drawCSVCoverage()
csvLoad()
完成之前执行。
@Marc我也这么认为。我在执行drawCSVCoverage()之前设置了50毫秒的超时时间,这就解决了这个问题。你认为这是一种合法的方法吗?@CaioCésarS.Leonardi yes在执行DrawCsvOverage和csvLoad之间的50毫秒延迟时间内对其进行了测试,并得出了正确的值。那么,这是执行依赖于先前异步函数的函数的正确方法吗?