Javascript 控制流量。回调、承诺、异步/等待背后的逻辑。有点什么';重点是什么?

Javascript 控制流量。回调、承诺、异步/等待背后的逻辑。有点什么';重点是什么?,javascript,node.js,asynchronous,promise,Javascript,Node.js,Asynchronous,Promise,我想我知道答案,但不确定。最想确认的是。这个问题(我认为同样)适用于所有三种异步方法(回调、承诺、异步/等待),但我将在承诺的上下文中提出这个问题 据我所知,异步编程旨在(至少)让事件驱动的应用程序响应事件执行任务,而不需要执行这些任务的过程阻碍应用程序执行任何其他任务(可能是响应其他事件)的能力。一个事件可能会触发这一系列任务: 查询数据库中的某些数据 等待回应 操作响应中的数据(或根据需要处理错误) 将更改写回数据库 完成了 在更传统的编程(如C/C++)中,会有一个主函数调用所有这些,并可

我想我知道答案,但不确定。最想确认的是。这个问题(我认为同样)适用于所有三种异步方法(回调、承诺、异步/等待),但我将在承诺的上下文中提出这个问题

据我所知,异步编程旨在(至少)让事件驱动的应用程序响应事件执行任务,而不需要执行这些任务的过程阻碍应用程序执行任何其他任务(可能是响应其他事件)的能力。一个事件可能会触发这一系列任务:

  • 查询数据库中的某些数据
  • 等待回应
  • 操作响应中的数据(或根据需要处理错误)
  • 将更改写回数据库
  • 完成了
  • 在更传统的编程(如C/C++)中,会有一个主函数调用所有这些,并可能从中获得一些回报。但一般来说,该主函数的过程会阻塞其他操作(除非您开始手动操作线程或其他东西,这可能是JS异步编程为我们提供的,对吧?)

    但是在上面的例子中,(概念上的)“main函数”不需要从中得到任何东西。第五步不是“返回一些我需要执行的结果”,而是“完成”,故事的结尾。如果我理解正确的话,以上内容更可能是由侦听器调用的。这个监听器是由JS/node相当于“main function”(从应用程序的入口点运行的代码)设置的,它早已结束,监听器现在正在运行该节目。整个应用程序需要执行的任何其他操作都将由侦听器捕获的其他独立事件触发。(并不是说这是唯一的方法,但据我所知,这是相当普遍的)。因此,用户可能会看到结果,然后点击另一个按钮或其他任何按钮来启动其他独立的任务。上述任务早已过时

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

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

    askDbForData() // step 1
    .then(responseFromDB => { // step 2
        makeTheDesiredChangesToTheData(responseFromDB)  // step 3
    })
    .then(changedData => writeBackToDB(changedData))  // step 4
    
    在我看来,这最终是一个接一个地链接函数,以执行本质上是同步任务的任务

    但是但是。。。同步…=阻挡

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

    我认为重点是:
    .next(…)
    接收结果并将其发送到链中的下一个部分——这一部分是“阻塞”(虽然它发生在眨眼之间,所以有点没有意义),但每一个(可能都很耗时)函数(如
    askDbForData()
    )--它们应该是异步的,并且返回承诺--独立于任何其他控制流等单独地执行它们的操作,因此不会阻塞任何内容

    换句话说,承诺链本身是同步的,但过程中的每一部分都是异步的。更重要的是,我认为:不是与同一链中的其他任务异步,而是与应用程序在由其他事件启动的其他链中执行的所有其他任务异步

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

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

    这就是重点吗?如果不是,我还缺什么

    谢谢

    想想这个。 你有一个函数a,它返回一个承诺,一个对未来的承诺。 你也有一个函数B做其他的事情

    function().then(result=>{console.log(result)}).catch(); 函数b()

    如果函数A中的承诺需要很长时间才能解决,为什么不在我们等待的时候继续执行函数B呢? 明白了吗

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

    否,此处显示的代码只执行
    askDbForData()
    的同步部分,然后返回。如果正确编码,第一部分通常什么都不是

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

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

    换句话说,承诺链本身是同步的,但过程中的每一部分都是异步的

    绝对不是,承诺链是异步的
    .next()
    存储稍后调用的函数引用,它既不调用也不等待该函数代码的调用

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


    我尽量避免使用“链”这个词,因为它似乎让你更加困惑。它不是一条链,而是一棵树,你可以并行或顺序地执行承诺。同样地,没有。

    synchronous!=顺序、异步!=同时,但我相信除了terminolog