我无法解决这个问题。
下面的功能runOneCombination
对成千上万个文件执行,我想提取一些信息,进行一些计算,然后将它们打印到我不断添加的文件中。
我认为不需要该项目的其他代码,但是如果可以的话,我可以共享它。
该问题在下面的代码中指示。我的期望是,对于Promise.all(res.dailyData.map( async (dailyDataRow,index,arr) => {
的每次迭代,将依次执行三个语句,并执行fs.writeSync(out,'\r\n');
。不幸的是,这不会发生。输出包含writeDaily(out,dailyDataRow)
的所有输出,并在其间没有换行符,但后跟一个换行符。然后是featureRow[0]
中包含的所有内容(由换行符分隔),然后是featureRow[1]
和featureRow[2]
中的所有内容(再次没有换行符)。
我的期望是:
dailyDataRow,featureRow[0],featureRow[1],featureRow[2],\r\n
以前,这种方法有效,但是没有附加到文件中,因此我只能处理一对文件作为输入。
function runOneCombination(dailyFile,simFile) {
return new Promise(async function(resolve, reject) {
let res = await process(dailyFile,simFile);
var wh = true;
if(await fs.existsSync(outFilePath))
wh = false;
var out = fs.openSync(outFilePath,'a');
// out.once('open', async function(fd) {
//Write Headers
if(wh) {
await writeHeaders(out);
}
await Promise.all(res.dailyData.map( async (dailyDataRow,index,arr) => {
if(index > 1) {
let samples = await getFeatures(dailyDataRow,res.cdData);
await samples.forEach(async (featureRow)=>{
//console.log(dailyDataRow,featureRow[0],featureRow[1],featureRow[2]);
if(!featureRow)
console.log("fail:",featureRow);
else {
//Problem is in the following lines:
writeDaily(out,dailyDataRow).then(async(val)=>{
writeFeatures(out,featureRow[0]).then(async(val)=>{
writeFeatures(out,featureRow[1]).then(async(val)=>{
writeFeatures(out,featureRow[2]);
});
});
});
}
});
fs.writeSync(out,'\r\n');
}
})).then((val)=>{
//out.end(); //close the writing stream
resolve('success');
});
// });
});
}
我在这里想念什么?
答案 0 :(得分:0)
为什么拥有then
时还使用await
?您需要停止使用then
并仅使用async
函数和await
。
除非包装了需要回调的内容,否则您永远不需要Promise构造函数。
您的问题肯定是samples.forEach
应该是:
for(featureRow of samples) { }
在异步函数中执行此操作将解决排序问题。因为每次迭代都会在下一次迭代之前完成。
我不想将您的代码固定为仅用于等待。但是无论如何这里是
async function runOneCombination(dailyFile, simFile) {
let res = await process(dailyFile, simFile);
let wh = await fs.exists(outFilePath)
let out = await fs.open(outFilePath, 'a');
//Write Headers
if (wh) {
await writeHeaders(out);
}
for (dailyDataRow of res.dailyData.slice(1)) {
let samples = await getFeatures(dailyDataRow, res.cdData);
for (featureRow of samples) {
if (!featureRow) {
console.log("fail:", featureRow);
continue;
}
//Problem is in the following lines:
await writeDaily(out, dailyDataRow);
for (let i = 0; i < 3; i++) {
await writeFeatures(out, featureRow[i])
}
await fs.write(out, '\r\n');
}
}
}
看起来可以正常工作,但需要进行一些测试。