以下是代码:
var getFile = document.getElementById("roll");
var init = getFile.files;
var rawResults = [];
if(init.length > 1){
for(var i = 0, ii = init.length; i < ii; i++){
Papa.parse(init[i], {
delimiter: "", // auto-detect
newline: "", // auto-detect
header: true,
dynamicTyping: false,
preview: 0,
encoding: "",
worker: false,
comments: false,
step: undefined,
complete: function(results, file) {
rawResults.push(results.data);
},
error: undefined,
download: false,
skipEmptyLines: false,
chunk: undefined,
fastMode: undefined,
beforeFirstChunk: undefined,
withCredentials: undefined
});
}
var flattening = _.flatten(rawResults);
console.log(rawResults);
console.log(rawResults.length);
}
当我尝试在_.flatten
数组上运行rawResults
下划线函数时,它变为空,因为由于getFile
函数是异步的,因此数组没有准备好数据在性质上。
脚本获取上传的文件,然后通过Papa Parse进行解析,然后结果最终填充到rawResults
数组中。
我尝试创建一个这样的回调函数:
function firstfunction(callbackfxn){
// Put the asynchronous getFile code here.
callbackfxn();
};
function secondfunction(){
firstfunction(function(){
// Put the parsing code in here
});
};
我尝试了其他回调变体但没有运气让它按照预期的那样工作。
答案 0 :(得分:1)
为什么不使用像bluebird或async.js这样的控制流程库?
以下是使用async#each
的示例{
"config": {
"COMPOSER_DISABLE_XDEBUG_WARN": true
}
}
循环遍历数组的每个元素,将迭代器函数应用于元素。触发完成事件后,它会调用回调函数来告诉函数它已完成。 async.each(init, function(file, callback) {
Papa.parse(init[i], {
delimiter: "", // auto-detect
newline: "", // auto-detect
header: true,
dynamicTyping: false,
preview: 0,
encoding: "",
worker: false,
comments: false,
step: undefined,
complete: function(results, file) {
rawResults.push(results.data);
callback();
},
error: undefined,
download: false,
skipEmptyLines: false,
chunk: undefined,
fastMode: undefined,
beforeFirstChunk: undefined,
withCredentials: undefined
});
}, function(error) {
// do something if error
var flattening = _.flatten(rawResults);
console.log(rawResults);
console.log(rawResults.length);
});
的最后一个参数是错误函数。一旦处理完所有元素,就会调用它。调用此函数后,应填充rawResults。