我不熟悉使用承诺(我在节点中使用'co'),所以我不完全确定这段代码有什么问题:
function* excelToJSON(excelFileNames) {
var jsonData = [];
for (let index = 0; index < excelFileNames.length; index++) {
parseXlsx(excelFilesNames[index], function (err, data) {
jsonData.push(data);
console.log(jsonData); //***Shows data correctly
});
}
console.log(jsonData); //***Empty array
return yield jsonData;
}
它读取文件,转换它,至少在循环中,它正确显示了所有内容,但是一旦我们退出循环,数据似乎就消失了。我也尝试从循环中返回其中一个值,但这也不起作用。
编辑: parseXlsx 来自这里的“excel”模块:https ://github.com/trevordixon/excel.js 老实说, 我不完全确定它是异步的还是同步的。这似乎是它的代码,我知道“extractFiles”返回一个承诺,但由于它随后通过“parseXlsx”,我不确定之后会发生什么:
function parseXlsx(path, sheet, cb) {
if (typeof cb === 'undefined') {
cb = sheet;
sheet = '1';
}
extractFiles(path, sheet).then(function(files) {
cb(null, extractData(files));
},
function(err) {
cb(err);
});
};
EDIT2:我用来解决它是几个答案的组合,谢谢大家。
function* excelToJSON(excelFileNames) {
return new Promise(function(resolve, reject) {
var jsonData = [];
if (excelFilesNames === null || excelFilesNames.length === 0) {
reject();
}
for (let index = 0; index < excelFilesNames.length; index++) {
parseXlsx(excelFilesNames[index], function(err, data) {
if (err) {
throw err;
}
jsonData.push(data);
if (jsonData.length === excelFilesNames.length) {
resolve(jsonData);
}
});
}
});
}