Javascript按顺序打印到文件
不知何故,我不能把我的头围绕在这个问题上 下面的函数Javascript按顺序打印到文件,javascript,node.js,file,promise,async-await,Javascript,Node.js,File,Promise,Async Await,不知何故,我不能把我的头围绕在这个问题上 下面的函数runOneCombination针对数千个文件执行,我想提取一些信息,进行一些计算,然后将它们打印到我一直附加到的文件中 我不认为这个项目的其他代码是必要的,但如果它是,我可以分享它 下面的代码中指出了该问题。我的期望是,对于Promise.all(res.dailyData.map(async(dailyDataRow,index,arr)=>{的每次迭代,这三条语句按顺序执行,fs.writeSync(out,'\r\n');被执行。不幸
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');
});
// });
});
}
我在这里遗漏了什么?当您有
等待时,为什么还要使用然后呢?您需要停止使用然后并且只使用异步
函数和等待
您永远不需要Promise构造函数,除非您正在包装接受回调的内容
您的问题肯定是示例。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');
}
}
}
异步函数runOneCombination(dailyFile、simFile){
let res=等待进程(dailyFile,simFile);
让wh=等待fs.存在(outFilePath)
放出=等待fs.打开(出口路径“a”);
//写标题
if(wh){
等待书面负责人(外出);
}
for(res.dailyData.slice的dailyDataRow(1)){
let samples=wait getFeatures(dailyDataRow,res.cdData);
用于(特征样本行){
如果(!featureRow){
console.log(“失败:”,featureRow);
继续;
}
//问题在于以下几行:
等待写入(输出,每日数据行);
for(设i=0;i<3;i++){
等待写入功能(输出,功能行[i])
}
等待fs.写入(输出“\r\n”);
}
}
}
看起来它可以工作,但需要一些测试