我是新來與承諾的工作(我使用節點「CO」),所以我不完全知道是什麼,此代碼失敗:CONSOLE.LOG顯示數組,但不能退貨
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);
}
});
}
});
}
'parseXlsx'是一個異步函數嗎? – Weedoze
不錯,但是在這裏做一個發電機功能的目的是什麼?如果生成器返回一個承諾,這是否表現爲異步函數? – Alex
它似乎是如此。檢查'co': https://www.npmjs.com/package/co – Vonmood