Promise.all 嵌套 Promise.all 顺序错乱?

2022-12-06 14:26:24 +08:00
 w292614191
我有下面这段代码,理论应该先输出“11111111”在输出“cccc”。

https://imgur.com/a/YuHi7NC.png

实际在控制台却不是这样的。

https://imgur.com/u98fTNa.png


哪位大佬能分享下这是为什么吗?
1310 次点击
所在节点    问与答
17 条回复
w292614191
2022-12-06 14:32:33 +08:00




补两张图。
timethinker
2022-12-06 14:44:56 +08:00
Promise 构造函数传入的 executor 函数会被立即执行。
pixcai
2022-12-06 14:47:28 +08:00
2 楼说的对
churchill
2022-12-06 14:47:40 +08:00
johnli
2022-12-06 14:52:14 +08:00
2 楼说的对,所以依赖的顺序是 resolve 的结果,不是中间过程
w292614191
2022-12-06 15:18:37 +08:00
@timethinker #2 也就是在需要的时候构建,而不是提交构建放哪里?
w292614191
2022-12-06 15:19:08 +08:00
@timethinker #2 而不是提前构建好。
w292614191
2022-12-06 15:22:35 +08:00
@timethinker #2 还是不对,我不调用 Promise.all ,他们也执行,这是啥逻辑?

应该是 Promise.all 然后才会并发执行吧?
w292614191
2022-12-06 15:23:29 +08:00
如果是“立即执行” ,Promise.all 的意义是啥?结果都产生了。
timethinker
2022-12-06 15:26:20 +08:00
Promise != Lazy ,你需要的更像是 Lazy
timethinker
2022-12-06 15:31:31 +08:00
w292614191
2022-12-06 15:44:47 +08:00
@timethinker #11 学习了,非常感谢,我现在理解了。
jadehare
2022-12-06 15:50:55 +08:00
@w292614191 #9
let getSys = function(resolve){
console.log("111")
resolve();
}
ruleArr.push(getSys);

Promise.all(ruleArr.map(a=>new Promise(a)));
Yeen
2022-12-06 21:14:25 +08:00
你传给 promise 的异步回调本身并不能保证同步顺序。
这个问题简化一下更好理解。你构造两个 promise ,都是 http 请求。你并不能保证哪个请求先返回。
如果需要同步,要么在 then 串行起来;要么 await 同步。
Yeen
2022-12-06 21:19:26 +08:00
@w292614191 立即执行不等于立即有结果。比如网络请求
okakuyang
2022-12-07 00:22:37 +08:00
可以在 for of 里用 awit 顺序执行
ZoeeoZ
2022-12-07 11:05:46 +08:00
promise.all 我遇到过最迷幻的一次问题是: 里边的两个(校验表单的)函数调换一下顺序(比如 B,A)就永远走失败,但不调换(A,B)就正常,我调了 N 久才发现是这俩顺序的问题

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/900496

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX