gpt4 book ai didi

javascript - 将函数包装在 promise 中是否会导致函数的代码由另一个线程并行执行?

转载 作者:行者123 更新时间:2023-11-30 11:19:42 25 4
gpt4 key购买 nike

我读过很多关于 promises 和 async/await 的文章。他们似乎都在处理返回 promise 的 API 以及如何处理这些 promise 。我还是有点困惑。

假设我有一个包含三 (3) 个循环的函数。假设地,每个循环执行一些需要五 (5) 秒才能完成的工作,将每次迭代的结果推送到该循环的数组中。这项工作同步进行(循环 1 运行,然后是循环 2,然后是循环 3)。

函数然后在返回之前对所有三个循环的结果进行处理。假设的总执行时间约为十六 (16) 秒。

如果循环被放入它们自己的函数中,包装在一个 promise 中,然后使用 await Promise.allasync function 中等待(在对结果做一些事情之前) ),它们是否会并行执行(因为它们在事件循环中,而不是调用堆栈中)并且一旦所有三 (3) 个 promise 都已解决,该函数将继续?这比整个进程同步要快吗?

我想我对何时/为什么要从同步 JS 创建自己的 promise 感到困惑?

function loop1() {
return new Promise((resolve, reject) => {
let loop1Counter = 0
const loop1Array = []
while (loop1Counter < 10 **8) {
// Do some work
loop1Array.push(resultOfWork)
}
loop1Counter += 1
resolve(loop1Array)
}
}

async function test() {
const promisesToAwait = [loop1(), loop2(), loop3()]
const results = await Promise.all(promisesToAwait)
// Do some work with results
return something
}

最佳答案

JavaScript 执行是单线程的。这意味着如果不使用诸如 WebWorker 之类的机制,则所有 javascript 代码都不会并行执行。话虽如此,使用异步代码(如 promises)执行同步 javascript 有几个原因。

  1. 您的代码需要一段时间才能执行。

Javascript 执行与浏览器中的 UI 共享同一个线程。这意味着如果您的代码需要 5 秒来执行,则用户浏览器将在此期间被阻止。您可以改为将执行分解为多个异步执行的 block ,这将允许 UI 保持响应。

  1. 您正在参与来自现有异步函数的 promise 链。

有时需要混合异步和同步代码。 Promise 允许您将异步和同步代码组合到执行链中,而无需硬编码依赖项。

  1. 您遇到了堆栈大小限制。

根据您的代码和库的编写方式,有时您可能会用尽堆栈,这可能会导致堆栈大小异常或内存使用过多。通过异步执行一段代码,它获得了自己的新堆栈。

  1. 您正在库/框架中执行代码,该库/框架期望您的代码异步执行。

您可以将同步代码转换为异步代码,但反之则不行。因此,一些执行您编写的代码(作为委托(delegate))的库可能需要您的代码是异步的以支持异步用例。一些库试图对此进行智能处理并根据您的返回类型进行调整,但并非所有库都如此智能。

关于javascript - 将函数包装在 promise 中是否会导致函数的代码由另一个线程并行执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50278356/

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