我尝试重命名节点中的文件,然后在子进程中打开它,并在用户关闭子进程时将其重命名回来。但不知怎的,我脑子里并没有想到承诺的想法。该脚本有效,但函数
ShowFile()
似乎不等待 writeFile()
。因此,当外部阅读器快速打开时,文件尚未准备好。 (当我使用 Powerpoint 等较慢的程序打开文件时,一切正常)
我所拥有的(以非常简单的方式):
ShowFile(oldName, newname).then(function(result){
child = result[0];
tempfiles = result[1];
}).then(function(){
child.on('close', function (code) {
for (let x of tempfiles) {
fs.rename(x.newname, x.oldname, (err) => {
if(err) throw err;
});
}
});
});
async function ShowFile(oldName, newname) {
let tempfiles = await writeFiles(oldName, newname);
let child = cp.exec(getCommandLine() + ' " ' + path to pdf reader + '"' + newname + '"');
return [child, tempfiles];
}
async function writeFiles(oldName, newname) {
return new Promise(function (fullfill, reject) {
let tempfiles = [];// Array of filenames I get from another source
for (let x of tempfiles) {
fs.renameSync(oldName, newname);
fs.writeFileSync(oldName, '', (err) => { //an empty file I need for something else
if (err) throw err;
});
}
fullfill (tempfiles);
reject ('error!');
});
}
我知道在这个示例中,临时文件上的循环没有任何意义,但这确实是一个非常简化的示例。
writeFiles
中的函数调用是阻塞和同步的。你不需要承诺。 cp.exec
是非阻塞且异步的。您必须等待它或使用同步变体:
const [child, tempfiles] = ShowFile(oldName, newname);
child.on('close', function (code) {
for (let x of tempfiles) {
fs.rename(x.newname, x.oldname, (err) => {
if(err) throw err;
});
}
});
function ShowFile(oldName, newname) {
let tempfiles = writeFiles(oldName, newname);
let child = cp.execSync(getCommandLine() + ' " ' + path to pdf reader + '"' + newname + '"');
return [child, tempfiles];
}
function writeFiles(oldName, newname) {
let tempfiles = [];// Array of filenames I get from another source
for (let x of tempfiles) {
fs.renameSync(oldName, newname);
fs.writeFileSync(oldName, '', (err) => { //an empty file I need for something else
if (err) throw err;
});
}
}