在Promise
中的以下代码中,有三个函数调用。这些功能如何执行;并联还是串联?
return Promise.all([
getUserData({ req }),
getNetworkServiceCountsData({ req }),
getShelfServiceCountsData({ req }),
])
答案 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