首页 > 解决方案 > 澄清使用 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 解析的承诺,因此等待它是多余的?

谢谢!

标签: javascriptnode.jsasynchronouspromiseasync-await

解决方案


我应该await writeFile在内部foo确保这种行为吗?

是的。

还是整个promise的resolve都foo依赖于promise的writeFileresolve

否。函数的承诺解析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就不能触发并忘记任务。


推荐阅读