如何将箭头函数转换为异步函数?

10

我有以下代码,用于检查文件是否存在,如果存在,则解析其中的JSON数据:

fs.access(dbPath, (err) => {
        if (err) throw err
        else{
            console.log('Database found. Processing data.');
            dbObj = processDatabaseFile(dbPath);
            console.log('checkonstartup: '+dbObj);
            return;
        }
    });

这里是processDatabaseFile函数:

function processDatabaseFile(path){
    fs.readFile(path, (err, data) =>{
        if (err) throw err;
        let jsonData = JSON.parse(data);
        return jsonData;
    })
}

我的问题在于当调用fs.access函数时,它比processDatabaseFile(dbPath)返回更快。 例如,我想使用async await,但我不知道该如何操作。

尝试将async (err) => { ...声明放置后,使用dbObj = await processDatabaseFile(dbPath),但出现了关于if-else、分号和缺少括号的错误。

感谢反馈。

编辑: 关于添加async-await时出现的错误。我使用的是VSCode,结果发现ESLint和JSHint互相冲突。

2个回答

16

您可以使用以下语法使箭头函数变为异步函数。

const asyncFunc = async () => {
    const result = await someAsyncFunc();
}

await someAsyncFunc() 中的 someAsyncFunc() 必须是真正的异步函数吗? - VikingPingvin
@VikingPingvin 是的,它必须返回一个 Promise。 - Bergi
1
不,await的值可以是一个值,await 2 + 2将等于4。但是如果someAsyncFunc()是基于回调的并且没有返回任何内容,则await someAsyncFunc()将只是未定义的。您需要先将其转换为Promise。 - mbojko
哦,是的,它期望从 someAsyncFunc() 返回一个 Promise。但是,如果 someAsyncFunc() 不是异步的,我认为使用 await 没有意义。 - bjupreti
在我的情况下,它使用了fs.readFile(),而我并不想让它阻塞。 - VikingPingvin

2

在Node中,您可以轻松地将fs.readFile()方法转换为Promise,只需使用内置的promisify方法即可。例如:

const { promisify } = require('util');
const readFileAsync = promisify(fs.readFile);

这样,您就可以像使用任何其他Promise一样使用readFileAsync()方法了。

“Original Answer”翻译成中文是“最初的回答”。

const { promisify } = require('util');
const fs = require('fs');
const readFileAsync = promisify(fs.readFile);

fs.access(dbPath, async (err) => {
    if (err) throw err
    else {
        console.log('Database found. Processing data.');
        const dbObj = await processDatabaseFile(dbPath);
        console.log('checkonstartup: ' + dbObj);
    }
});

async function processDatabaseFile(path) {
    const data = await readFileAsync(path);
    return JSON.parse(data);
})

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接