【发布时间】:2019-10-24 14:08:25
【问题描述】:
我想我知道这个问题的答案,但我没有找到任何关于它的文档,所以我想确保我没有错过任何东西。
const prom1 = axios.get('/user/1').then(res => {
/* do stuff with response */
return res;
});
const prom2 = axios.get('/user/2').then(res => {
/* do stuff with response */
return res;
});
Promise.all([prom1, prom2]).then(() => setLoading(false));
在上面的例子中,Promise.all() 的.then 似乎总是在axios.get().then() 之后执行。但是prom1真的只有在axios的.then()被执行之后解决了吗?
我的理解/猜测:
axios.get('/user/1').then(...);
/* THOSE TWO ARE THE SAME */
const prom = axios.get('/user/1');
prom.then(...);
Promise.all() 中的.then() 总是在axios.get().then() 之后执行 的原因是它们是同步执行的,因此首先调用哪个.then() 很重要? p>
我知道我总是可以这样做:
const prom1 = axios.get('/user/1').then(res => res);
const prom2 = axios.get('/user/2').then(res => res);
Promise.all([prom1, prom2]).then(() => {
prom1.then(...);
prom2.then(...);
setLoading(false);
});
但这只会在所有承诺都解决后触发,如果...-codeblocks 中有一些 compute-heavy 的东西,我不只是想开始在响应所有 API 请求后在它们上执行。
【问题讨论】:
-
你问题的最后一部分让我猜想你正在尝试解决某种你没有问到的问题。这看起来像 XY 问题。你想解决什么问题?
-
实际上,我的运行代码完全没有问题,只是我处于知识的边缘(对 javascript 和 ReactJS 相当陌生),虽然我看到了潜在的竞争条件,我不确定它是否真的存在,如果存在,解决它的最佳做法是什么。此外,我希望代码具有良好的风格,以便其他人可以轻松使用它。
-
您问题中的最后一个代码 sn-p 不需要
then在Promise.all内,因为来自承诺的数据已经可用,通过解构Promise.all的 @ 来使用它们987654337@ 的参数类似于[res1, res2]。 -
Promise.all([prom1, prom2]).then(([res1, res2]) => {
标签: javascript reactjs asynchronous axios es6-promise