私は(私はノードの「コ」を使用しています)約束での作業に新たなんだので、私は、このコードで失敗しているもの全くわからない:に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;
}
ファイルを読み込んで変換し、少なくともループ内ではすべてが正しく表示されますが、ループから抜けるとデータが消えるようです。私はまた、ループ内から値の1つを返そうとしましたが、どちらも機能しません。
編集:私はそれを正直に言うと、非同期または同期だ場合、完全にはわからないhttps://github.com/trevordixon/excel.js : parseXlsxは、ここに「エクセル」のモジュールからです。これは、そのコードのようだ、と私は「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