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。这几乎肯定不是你想要的。异步函数应该 await
或 return
在某个地方,否则它也可能是标准函数(return 什么都没有)。
即使您不关心请求解析的结果,您仍然应该使用请求的结果(通过 returning 或 await
ing,这样您就可以看到是否请求成功与否 - 如果失败则告知用户有问题)
第二个将触发请求 和 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 调用的解析值。
差异:
您可以使用 makeFetch2()
函数获取 axios.get()
调用的结果(解析值或拒绝错误)。您无法使用 makeFetch1()
获取 axios.get()
调用的结果,因为该结果不会以任何方式传回给调用者。
类似地,makeFetch2()
将允许调用者知道 axios 操作何时完成。 makeFetch1()
不会。
如果 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()
可能只是没有用,因为它不会通知调用者完成、错误或已解析的值。
我只是想知道 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。这几乎肯定不是你想要的。异步函数应该 await
或 return
在某个地方,否则它也可能是标准函数(return 什么都没有)。
即使您不关心请求解析的结果,您仍然应该使用请求的结果(通过 returning 或 await
ing,这样您就可以看到是否请求成功与否 - 如果失败则告知用户有问题)
第二个将触发请求 和 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 调用的解析值。
差异:
您可以使用
makeFetch2()
函数获取axios.get()
调用的结果(解析值或拒绝错误)。您无法使用makeFetch1()
获取axios.get()
调用的结果,因为该结果不会以任何方式传回给调用者。类似地,
makeFetch2()
将允许调用者知道 axios 操作何时完成。makeFetch1()
不会。如果
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()
可能只是没有用,因为它不会通知调用者完成、错误或已解析的值。