.catch无法解决错误并打破束缚

时间:2019-05-26 00:20:27

标签: node.js promise fs

我正在尝试写入文件。某些文件将被写入错误的路径。对于每个文件,我需要 1.登录到开始写入的控制台。 2.写入文件 3A如果完成写入,则登录到控制台完成。 3B如果路径错误,请登录控制台,确认文件失败

现在,如果失败,则将两者都写入控制台。

我尝试嵌套.thens,我尝试仅回呼。

async function beginWrite(filename){
    console.log(`Creating file ${filename}`)
}

async function writeComplete(filename){
    console.log(`Finished creating file ${filename}`)
}

async function writeFile(path, filename){
    fs.writeFile(path + '/' + filename, 'this is a file', (error) => {
        if(error) {console.log(`File ${filename} failed to write`)}
    });
}

async function logAndWrite(path, filename){
    beginWrite(filename)
    .then( () => {
        writeFile(path, filename)
    }
    )
    .then(writeComplete(filename))
    .catch( (e) => {
        return console.log(`File ${filename} failed to write`)
    })
}

我希望

文件1写入 文件1完成 文件2写 文件2写入失败 文件3写作 文件3完成

1 个答案:

答案 0 :(得分:0)

您不能简单地在函数声明上撒上async并希望魔术发生。

async是应对承诺的一种方式。它要求您在异步函数内部await {Promise},这反过来又要求您实际上拥有一个返回Promise的函数。您什么都不做。

首先,您需要一个返回Promise的函数。 Node的本机异步函数使用回调并且不返回任何内容,因此,如果要使用本机fs.writeFile()并返回Promise,则需要制作包装函数。此过程称为“承诺”,当手动完成时,它看起来像这样:

function writeFileAsync(file, data){
    return new Promise(resolve => {
        fs.writeFile(file, data, err => {
            if (err) throw err; else resolve();
        })
    });
}

Node还具有实用程序,可对任何节点样式的异步功能(util.promisify(original))一步完成相同的操作。

const writeFileAsync = util.promisify(fs.writeFile);

现在我们可以await进行操作了,我们可以制作一个async来等待它的功能(请注意,您绝对需要 try / catch块):< / p>

async function test() {
    try {
        let filename = 'some/file';
        console.log(`Creating file ${filename}`)
        await writeFileAsync(filename, 'this is a file');
        console.log(`Finished creating file ${filename}`)
    } catch (err) {
        console.log(`File ${filename} failed to write`);
        console.log(err);
    }
}

或者我们可以将其与Promises的等效常规.then().catch()语义结合使用:

let filename = 'some/file';
console.log(`Creating file ${filename}`);
writeFileAsync(filename, 'this is a file')
    .then(() => {
        console.log(`Finished creating file ${filename}`
    })
    .catch((err) => {
        console.log(`File ${filename} failed to write`);
        console.log(err);
    });