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