Javascript 如何立即更新从异步FileReader函数初始化的变量?
我正在尝试使用FileReader将csv文件的内容保存到变量中。我设法获取了内容并将其保存到变量csvAreas中,但没有立即更新。我尝试过使用回调方法和jquery$.when().then(),但仍然不起作用 test.csv: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
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毫秒延迟时间内对其进行了测试,并得出了正确的值。那么,这是执行依赖于先前异步函数的函数的正确方法吗?