如何使箭头功能异步? [复制]

Posted

技术标签:

【中文标题】如何使箭头功能异步? [复制]【英文标题】:How to make arrow function async? [duplicate] 【发布时间】:2019-09-04 01:31:42 【问题描述】:

我有以下代码检查文件是否存在,如果存在,则解析其中的 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 (err) => ... 声明然后使用 dbObj = await processDatabaseFile(dbPath) 但它会在 if-else 和分号以及缺少括号时出现错误。

非常感谢您的反馈。

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

await someAsyncFunc() 中的 someAsyncFunc() 真的必须是异步的吗? @VikingPingvin 是的,它必须返回一个承诺 不,awaited 值可以只是一个值,await 2 + 2 将等于4。但是如果someAsyncFunc() 是基于回调的并且不返回任何内容,那么await someAsyncFunc() 将只是未定义的。你需要先承诺它。 哦,是的,它希望从someAsyncFunc() 返回一个 Promise。但是,如果someAsyncFunc() 不是异步的,我认为使用await 是没有意义的。 在我的情况下是这样,因为它使用 fs.readFile(),我真的不想让它阻塞。【参考方案2】:

Promisify fs.readFile(),在 Node 中你会得到 promisify 开箱即用。类似的东西

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);
)

【讨论】:

以上是关于如何使箭头功能异步? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何返回异步箭头功能?

如何使单独的同步功能等待另一个异步功能?

如何在 ngZone 之外运行异步功能? [复制]

如何在异步功能上使用 debounce? [复制]

如何使特定平台可以访问功能? [复制]

文本换行时如何使宽度适合内容? [复制]