代码按承诺和执行顺序的流向是什么?

时间:2019-04-29 11:38:12

标签: javascript function

Promise中的以下代码中,有三个函数调用。这些功能如何执行;并联还是串联?

return Promise.all([
  getUserData({ req }),
  getNetworkServiceCountsData({ req }),
  getShelfServiceCountsData({ req }),
])

2 个答案:

答案 0 :(得分:1)

这三个功能按照您放置它们的顺序执行。但是这些功能可以利用某些异步请求(例如http请求),并且JavaScript不会阻止执行以等待此类请求的响应。取而代之的是,这些功能通常在事件发生时从较低的操作系统层冒出一个监听器,并且它们立即立即返回承诺,而无需等待此类事件。

因此,第一个函数触发一个请求并返回一个promise,然后第二个函数执行相同的操作,然后是第三个。然后,我们将三个未解决的承诺传递给Promise.all,该承诺还返回一个未解决的承诺。

然后等待开始...

这些异步请求的处理可能发生在不同的层,甚至可能在不同的服务器,某些数据库或Web服务上。通常,此类处理可以是并行的,因为它不受单线程JavaScript引擎的限制。该处理最终导致JavaScript事件队列中的事件。我前面提到的事件侦听器由JS事件循环调用,并且那些处理程序解析相应的Promise。

由于这三个任务的处理时间可能不同,因此无法保证承诺解决方案的顺序。

但是,当所有三个承诺均得到解决(无论其解决顺序如何)时,Promise.all返回的承诺也将得到解决。

是的,事情将并行运行,而不是JavaScript代码。

答案 1 :(得分:0)

执行是并行的,但结果中的值与承诺中的顺序相同。

此外,一旦所有承诺都得到解决,它将返回一个承诺。如果任何一个承诺失败,它将立即拒绝,并带有被拒绝的承诺错误值,而不管其余承诺是否得到解决。

您可以在下面找到参考链接以更好地理解:

https://medium.com/@muralikv/implementing-promise-all-in-javascript-732076497946

Promise.all: Order of resolved values