首页 > 解决方案 > 控制流。回调、承诺、异步/等待背后的逻辑。有点什么意思?

问题描述

我想我知道这个问题的答案,但不确定。想要确认比什么都重要。这个问题(我认为同样适用)适用于所有三种异步方法(回调、承诺、异步/等待),但我会在承诺的上下文中问这个问题。

据我了解,异步编程旨在(至少)让事件驱动的应用程序执行任务以响应事件,而执行这些任务的过程不会阻止执行任何其他任务的能力(大概是为了响应其他事件)应用。例如。一个事件可能会触发这一系列任务:

  1. 在数据库中查询一些数据
  2. 等待回复
  3. 处理响应中的数据(或根据需要处理错误)
  4. 将更改写回数据库
  5. 完毕。

在更传统的编程(例如 C/C++)中,会有一个 main 函数调用所有这些,并可能从中得到一些东西。但一般来说,那个 main 函数的进程,坐等它回来,阻塞了其他操作(除非你开始手动操作线程或其他东西,这个 JS 异步编程大概应该让我们免于,对吧?) .

但是在上面的例子中,据说(概念上的)“主要功能”不需要任何东西。第 5 步不是“返回一些我需要采取行动的结果”,而是“完成”,故事结束。如果我理解正确,以上内容更有可能是由听众调用的。该监听器是由 JS/node 等效的“主函数”设置的——从应用程序入口点运行的代码——它早已结束,监听器现在正在运行节目。整个应用程序需要做的任何其他事情都将由其他一些独立事件触发,并被侦听器捕获。(并不是说这是唯一的方法,但据我了解,这很常见)。因此,也许用户看到了结果,然后点击另一个按钮或其他任何东西来启动其他一些单独的、独立的任务。

好的...如果所有这些都是正确的,那么就是这样:对于这 5 个步骤中的每一个,我们需要连续调用它们。每一步都依赖于前一步提供的东西。所以这个过程基本上需要是同步的。

在承诺代码中,我相信它看起来像这样:

askDbForData() // step 1
.then(responseFromDB => { // step 2
    makeTheDesiredChangesToTheData(responseFromDB)  // step 3
})
.then(changedData => writeBackToDB(changedData))  // step 4

在我看来,最终这是一个接一个地链接函数来执行本质上是同步任务的任务。

但是但是但是……同步……=阻塞?

我刚刚意识到在我读过的大多数文档/文章中,这对我来说似乎不是很清楚。这是我需要澄清的...

我认为关键是:.next(...)获取结果并将其发送到链中的下一个部分的部分——该部分是“阻塞”(虽然它发生在眨眼之间,所以它有点没有实际意义),但是每个在那些(可能是耗时的)函数中(比如askDbForData())——它们应该是异步的,并返回承诺——它们的工作是分开做的,独立于任何其他控制流等,因此不会阻塞任何东西。

换句话说,promise 链本身是同步的,但沿途的每一块都是异步的。我认为最重要的是:不是与同一链中的其他任务异步,而是与应用程序在由其他事件启动的其他链中执行的所有其他操作异步。

可能任何阅读本文的人都会阅读它并说“是的,嗯,这就是重点”。也许这就是我所希望的。但如果是的话,到目前为止我的任何研究都还不清楚,所以很高兴从“得到”它的人那里弄清楚。我认为如果所有这些都是正确的,那么它几乎可以消除我对这个主题的所有其他困惑。

所以......是的,这很长,但这只是一个问题。问题是:

是这样吗 - 这就是重点 - 或者如果不是,我错过了什么?

谢谢!

标签: javascriptnode.jsasynchronouspromise

解决方案


在我看来,最终这是一个接一个地链接函数来执行原本本质上是同步任务的任务

不,您在那里显示的代码仅执行 的同步部分askDbForData(),然后返回。如果编码正确,第一部分通常什么都不是。

我认为重点是: .next(...) 获取结果并将其发送到链中的下一个部分的部分——该部分是“阻塞”的(尽管它发生在眨眼之间,所以这有点没有意义)

再次不,仅在上一步完成后才调用延续。一旦发生延续,就会发生相同的拆分,首先运行同步(希望最小或不存在)部分,然后将函数的其余部分注册为延续。

换句话说,promise 链本身是同步的,但沿途的每一块都是异步的。

绝对不是,promise 链是异步的。.next()存储要在以后调用的函数引用,它既不调用也不等待调用该函数代码。

我认为最重要的是:不是与同一链中的其他任务异步,而是与应用程序在由其他事件启动的其他链中执行的所有其他操作异步。

我试图避免使用“链”这个词,因为它似乎让你更加困惑。它不是链,而是树,您可以并行或顺序执行 Promise。再说一次,不。


推荐阅读