当前位置: 首页 > 知识库问答 >
问题:

使用Async/Await澄清promise顺序解决方案

夔桐
2023-03-14

我对Javascript相当陌生,希望在谈到如何解决promise的顺序时,能对async/await做一点澄清。

假设我有一个异步函数,我们称之为foo,它检索某些内容,然后使用fs将其写入文件。promise图书馆。

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的promise已得到解决。在这里等待foo已经足够了,还是foo的promise可以在writeFile的promise解决之前解决?我应该在foo中等待writeFile以确保这一行为,还是foo的整个promise解决依赖于writeFile解决的promise,因此等待它是多余的?

非常感谢。

共有3个答案

万楷
2023-03-14
const foo = async () => {
const x = await getX(); 
fs.promises.writeFile(path, x); // do I need to await this?
}

WriteFile是一个返回promise的异步函数。

const doSomething = async () => {
await foo(); //
otherFileFunc(); };

将在没有写文件完成的情况下调用TherFileFunc()。

解决方案:

const foo = async () => {
const x = await getX();
return fs.promises.writeFile(path, x); // do I need to await this?
}

现在,writeFile本身返回一个promise,由foo()返回。因为foo()现在从writeFile返回promise,await foo()按预期工作。

所以,在我看来,你的第二个答案是正确的。

foo的整个promise解决依赖于书面文件解决的promise,因此等待它是多余的?

皮弘博
2023-03-14

您在后台编写了一个文件,而foo函数没有await语句,在文件完成编写之前解决了它的promise,这是不正确的。

在这里等待foo已经足够了,还是foo的promise可以在writeFile的promise解决之前解决?我应该在foo中等待writeFile以确保这一行为,还是foo的整个promise解决依赖于writeFile解决的promise,因此等待它是多余的?

foo的promise由foo代码控制。每个wait都使promise等待另一个promise。函数的promise将在函数代码结束时解决。

对于每个异步函数调用,通常等待,以获取结果值或知道任务何时完成(如在同步编程中)。

const foo = async () => {
  const x = await getX();
  await fs.promises.writeFile(path, x);
};

doSomething将按预期工作,因为它将等待foo()返回的promise,而foo()又将等待getX()返回的promise,然后等待fs返回的promise。promise。writeFile()

附笔。

MDN有一篇关于异步/等待的好文章,它涵盖了概念、与promise的相关性和错误处理。

裴欣然
2023-03-14

我是否应该在foo中等待writeFile以确保此行为?

或者foo的整个promise解析依赖于writeFile解析的promise吗

否。async函数的promise解析仅取决于其主体的返回值。要使其依赖于另一个promise,您必须等待,以暂停异步函数的执行。通过考虑返回被调用函数的结果(即使值是未定义的,在您的情况下,隐含的结果是文件已完全写入),可以最容易地实现这一点-您只能在等待结果的情况下才能这样做。

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

在执行async函数期间创建的任何promise都没有隐式等待。如果有的话,你a)不能做像Promise.allb)这样的事情,如果你真的不想等待,就不能启动和忘记任务。

 类似资料:
  • 本文向大家介绍详解koa2学习中使用 async 、await、promise解决异步的问题,包括了详解koa2学习中使用 async 、await、promise解决异步的问题的使用技巧和注意事项,需要的朋友参考一下 关键词:async 、await、promise 这三个东西 可以优雅的解决异步问题。在学习koa2的时候遇到了获取数据后再进行模板渲染的异步问题。在查找各种资料后成功的解决了该问

  • 这是我的方法: 我显示加载程序时,但使用在抛给我一个关于字保留的错误。对于验证,我使用VeeValester 如何使用wait-insidepromise?

  • 现有这样的定义async/await的场景: 报错信息: 请问这里应该如何整改呢?

  • 为了更好地理解异步控制流,我阅读了几篇stackoverflow文章、博客文章和Nodejs设计模式书。现在,我很容易编写常规回调传递样式(CPS)代码。然而,我试图摆脱这种习惯,提高代码的可读性(或者,避免“回调地狱”)。我的问题是,我似乎把、和理解为单独的概念以及如何使用它们。但是,我不确定如何利用它们将CPS函数转换为没有嵌套。 null

  • Async/await 是以更舒适的方式使用 promise 的一种特殊语法,同时它也非常易于理解和使用。 Async function 让我们以 async 这个关键字开始。它可以被放置在一个函数前面,如下所示: async function f() { return 1; } 在函数前面的 “async” 这个单词表达了一个简单的事情:即这个函数总是返回一个 promise。其他值将自动被

  • 在第一章节,我们简要介绍了async/.await,并用它来构建一个简单的服务器。本章将更为详细讨论async/.await的它如何工作以及如何async代码与传统的 Rust 程序不同。 async/.await是 Rust 语法的特殊部分,它使得可以 yield 对当前线程的控制而不是阻塞,从而允许在等待操作完成时,其他代码可以运行。 async有两种主要的使用方式:async fn和asyn