Javascript按顺序打印到文件
Posted
技术标签:
【中文标题】Javascript按顺序打印到文件【英文标题】:Javascript print to file sequentially 【发布时间】:2019-05-18 23:13:04 【问题描述】:不知何故,我无法解决这个问题。
下面的函数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');
);
// );
);
我在这里错过了什么?
【问题讨论】:
【参考方案1】:当你有await
时,你为什么还要使用then
?你需要停止使用then
,只使用async
函数和await
。
除非你包装一些需要回调的东西,否则你永远不需要 Promise 构造函数。
你的问题肯定是samples.forEach
应该是:
for(featureRow of samples)
在异步函数中这样做将解决排序问题。因为每次迭代都会在下一次迭代之前完成。
我不想将您的代码修复为仅使用 await。但无论如何它都在这里:
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');
看起来它可以工作,但需要一些测试。
【讨论】:
以上是关于Javascript按顺序打印到文件的主要内容,如果未能解决你的问题,请参考以下文章
如何按顺序批量打印PDF\WORD\EXCEL格式的文件 混合打印500多个文件?
使用 JavaScript 按顺序播放 MP3 文件,无需 HTML5 音频