如何使箭头功能异步? [复制]
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 是的,它必须返回一个承诺
不,await
ed 值可以只是一个值,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);
)
【讨论】:
以上是关于如何使箭头功能异步? [复制]的主要内容,如果未能解决你的问题,请参考以下文章