等待重命名文件,然后在node中打开它

问题描述 投票:0回答:1

我尝试重命名节点中的文件,然后在子进程中打开它,并在用户关闭子进程时将其重命名回来。但不知怎的,我脑子里并没有想到承诺的想法。该脚本有效,但函数

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!');
    });
}

我知道在这个示例中,临时文件上的循环没有任何意义,但这确实是一个非常简化的示例。

javascript async-await promise node.js-fs
1个回答
0
投票

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;
        });
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.