javascript - 澄清使用 Async/Await 解决 Promise 的顺序
问题描述
我对 Javascript 相当陌生,并且在谈到解决 Promise 的方式/顺序时,我正在寻找一些关于 async/await 的澄清。
假设我有一个异步函数,我们称之为 foo,它检索一些内容,然后使用 fs.promises 库将其写入文件。
const foo = async () => {
const x = await getX();
fs.promises.writeFile(path, x); //do I need to await this?};
我还有另一个异步函数,它将调用 foo,然后在文件内容写入后对其进行处理——将其显示在网页上,进行计算,等等。
const doSomething = async () => {
await foo(); //want to make sure foo resolves before calling otherFileFunc
otherFileFunc(); };
我想确保在 otherFileFunc 执行之前文件内容已写入,即 writeFile 的承诺已解决。在这里等待 foo 是否足够,或者 foo 的承诺可以在 writeFile 的承诺解决之前解决?我应该在 foo 中等待 writeFile 以确保这种行为,还是 foo 的整个承诺解析依赖于 writeFile 解析的承诺,因此等待它是多余的?
谢谢!
解决方案
我应该
await
writeFile
在内部foo
确保这种行为吗?
是的。
还是整个promise的resolve都
foo
依赖于promise的writeFile
resolve
否。函数的承诺解析async
仅取决于return
其主体的 from(或 end)。要使其依赖于另一个 Promise,您必须 await
暂停该async
函数的执行。这最容易通过考虑被调用函数return
的结果来实现(即使值为undefined
,在您的情况下隐含的结果是文件已完全写入) - 只有在等待结果时才能这样做。
async function foo() {
const x = await getX();
await fs.promises.writeFile(path, x);
}
async function foo() {
const x = await getX();
return fs.promises.writeFile(path, x);
}
在函数执行期间创建的任何 Promise 都没有“隐式等待” async
。如果有,你 a) 不能做类似b)如果你真的不想等待,Promise.all
就不能触发并忘记任务。
推荐阅读
- azure - 无法使用管理 API 获取虚拟机的内存使用情况
- xml - 使用 XPATH 选择两个处理指令之间的所有文本节点
- python - 如何将数据框转换为宽格式?
- wordpress - 如何在 Wordpress DB 中解码预订日期
- css - 使用css在pdf中显示页面计数器
- javascript - Quill.js 链接格式是如何实现的?
- python - 使用 pandas.read_excel() 读取多张工作表时指定多个转换器字典
- laravel - Laravel - 如何将可为空的参数传递给中间件?
- ms-access - 如何恢复 Microsoft Jet DB 的密码?
- string - 如何更改 .csv 数据 Kotlin 中数字的格式