gpt4 book ai didi

javascript - 关于处理包含在 Promise 中的同步函数的问题

转载 作者:行者123 更新时间:2023-12-02 23:35:19 26 4
gpt4 key购买 nike

在很大程度上,我了解如何将异步和同步函数包装在 Promise 中,以及这样做的好处和原因。但是,我不明白它们在浏览器中是如何处理的。

例如,如果依次调用两个同步函数(两个连续的语句),则在第一个函数返回之前,第二个函数不会开始。如果每个同步函数都包装在 Promise 中,然后一个接一个地调用(不是在另一个语句的 then 语句中调用,而是在两个连续语句中调用),那么同步函数现在将同时处理,而不是按顺序?

除了对假设场景感兴趣之外,我有充分的理由提出这个问题。我正在开发一个扩展,可以在单个本地 HTML 页面中打开选项卡式显示。打开页面时,注入(inject)的脚本将打开 indexedDB 数据库并启动一组 Promise,这些 Promise 检索每个选项卡的数据并使用适当的数据填充每个选项卡的各个部分。将这些内容放在 Promise.all 中会给人这样的印象:所有这些工作都是同时进行的,并在检索数据时填充选项卡,而不是连续填充每个选项卡。

在许多单独的 Promise(每个选项卡一个 Promise)中,当事务完成时,将调用同步函数以在该选项卡的不同部分中显示数据。按照现在的编码,用于显示的同步函数在连续语句中被一个接一个地调用,这样选项卡的第二部分仅在第一部分完成并返回后才填充。因为整个事务已经完成,所以所有部分的数据都已检索;因此,第二个显示功能不必等待第一个功能完成。如果这些显示函数包含在 Promise 中并按原样调用,选项卡的两个部分是否会同时填充?

可以拆分事务,以便每个选项卡部分有一个事务,并且同步显示功能将在检索到其特定数据后立即开始;但是,我想为每个选项卡保留一笔交易。

无论哪种方式,加载过程就足够了;但我想了解,即使用户察觉不到,将显示功能包装在 promise 中是否会导致选项卡中的单独部分同时填充。

也许,我只是感到困惑,虽然 Promise 和 Promise.all 给人并发进程的印象,但 JavaScript 中确实没有这样的东西,所发生的只是异步函数当他们的事件完成时依次处理。如果是这样,如上所述,将同步函数包装在 Promise 中对于加速选项卡部分中的数据填充没有任何好处。

如果这是正确的,那么提高加载速度的唯一方法就是拆分事务;仅当事务中的一个数据检索步骤比其他步骤花费更长的时间并延迟事务的完成和显示该数据的功能的启动时,这才会有帮助。

对于这个问题的长度,我深表歉意,如果因为没有代码可供审查而被认为不合适,我当然可以毫无问题地删除它。但是,如果您能解释我的理解哪里错误,我将不胜感激。谢谢。

最佳答案

Javascript 是单线程的,因此 javascript 环境本身不存在并发性。您的同步部分填充函数将按照先到先得的原则执行。

当您调用像网络请求 Promise(甚至是 setTimeout 调用)这样的异步操作时,该执行会被分派(dispatch)到 javascript 环境之外进行处理,即在内核空间中进行处理。可以在不阻塞 js 执行的情况下运行,并且可能在单独的线程上运行。

当它返回时,容器(浏览器)通过将回调添加到消息队列将结果推回同步 javascript-land。当 JavaScript 调用堆栈为空时,事件循环会检查消息队列中是否有待处理的回调。如果它找到一个,它会将其推送到调用堆栈上,以便在下一个执行循环中执行。

无论哪个部分调用先返回,都将首先执行,任何其他返回的异步调用都必须等到第一个调用完成后才能运行。

某处有一篇非常棒的文章,它解释了所有这些如何比我更好(并且更权威)地工作。我会尝试找到它并用链接更新我的答案。

更新:This post解释得很好。

关于javascript - 关于处理包含在 Promise 中的同步函数的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56311004/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com