JS:Promise.all 有什么不同

JS: what's the different in Promise.all

我只是想知道 await Promise.all([/* ... /*]) 的这两个调用是否有区别 在我的性能测试中,它花费了相同的时间。

这是我要由 Promise.all:

调用的方法
const makeFetch1 = async () => {
  axios.get("https://jsonplaceholder.typicode.com/todos/1");
};

const makeFetch2 = async () => {
  return axios.get("https://jsonplaceholder.typicode.com/todos/1");
};

1) await Promise.all([makeFetch1(), makeFetch1(), ...])
2) await Promise.all([makeFetch2(), makeFetch2(), ...])

两者的执行时间结果相同,我应该选择什么?

第一个将触发请求 而不是 return 它 。所以 makeFetch1() 将导致立即解决的 Promise。这几乎肯定不是你想要的。异步函数应该 awaitreturn 在某个地方,否则它也可能是标准函数(return 什么都没有)。

即使您不关心请求解析的结果,您仍然应该使用请求的结果(通过 returning 或 awaiting,这样您就可以看到是否请求成功与否 - 如果失败则告知用户有问题)

第二个将触发请求 和 return 它 。因此 makeFetch1() 将导致 Promise 在请求解析后 解析 - 这可能需要几毫秒。

存在几个主要差异和多个编码错误。

首先关闭此代码:

const makeFetch1 = async () => {
  axios.get("https://jsonplaceholder.typicode.com/todos/1");
};

是一个 async 函数,它调用 axios.get() 然后立即 return 一个已经解析并具有 undefined 已解析值的承诺。这里没有等待 axios.get() 调用完成。

你的第二个代码块:

const makeFetch2 = async () => {
  return axios.get("https://jsonplaceholder.typicode.com/todos/1");
};

调用 axios.get() 和 return 它创建的承诺。因此,承诺此函数 returns 将在 axios.get() 调用完成时绑定到并且解析值将是 axios 调用的解析值。

差异:

  1. 您可以使用 makeFetch2() 函数获取 axios.get() 调用的结果(解析值或拒绝错误)。您无法使用 makeFetch1() 获取 axios.get() 调用的结果,因为该结果不会以任何方式传回给调用者。

  2. 类似地,makeFetch2() 将允许调用者知道 axios 操作何时完成。 makeFetch1()不会。

  3. 如果 axios.get() 操作被拒绝,那么 makeFetch1() 将导致未处理的拒绝错误,因为没有任何东西正在侦听拒绝。

那么,这两个:

await Promise.all([makeFetch1, makeFetch1, ...])
await Promise.all([makeFetch2, makeFetch2, ...])

两者都非常无用,因为您没有调用任何函数,所以没有任何执行。这些都将立即解析为函数引用数组的已解析值。 None 的 axios 调用被执行,因为实际上没有调用 makeFetch1()makeFetch2().


如果您打算用这两个函数实际执行函数:

await Promise.all([makeFetch1(), makeFetch1(), ...])
await Promise.all([makeFetch2(), makeFetch2(), ...])

然后,第一个立即解析为 undefined 值的数组作为解析值,因为请记住 makeFetch1() return 值与axios.get()呼唤。

第二个将正确等待 makeFetch2() 中的所有 axios.get() 调用完成,并将使用来自 axios.get() 调用的一组值进行解析。


Both have the same execution time result, what i should choose?

那是因为在您实现它们时,您在任何一种情况下都没有调用 makeFetchN() 函数。因此,它们什么都不做,因此执行时间相同。

如果您更改实现以实际调用函数,如:

await Promise.all([makeFetch1(), makeFetch1(), ...])
await Promise.all([makeFetch2(), makeFetch2(), ...])

会有显着的时间差异,因为基于 makeFetch1() 的调用不会等待任何 axios.get() 调用完成,也不会返回结果或完成,并且会受到未捕获的影响拒绝。

基于makeFetch1()的那个没有实际用途,你可以这样做:

makeFetch1();
makeFetch1();
...

具有完全相同的结果,因为 makeFetch1() 只是 return 一个立即解决的承诺,因此将它们全部传递给 Promise.all() 没有任何用处。

makeFetch1() 可能只是没有用,因为它不会通知调用者完成、错误或已解析的值。