V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
w292614191
V2EX  ›  问与答

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

  •  
  •   w292614191 · 2022-12-06 14:26:24 +08:00 · 1479 次点击
    这是一个创建于 719 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我有下面这段代码,理论应该先输出“11111111”在输出“cccc”。

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

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

    https://imgur.com/u98fTNa.png


    哪位大佬能分享下这是为什么吗?
    17 条回复    2022-12-07 11:05:46 +08:00
    w292614191
        1
    w292614191  
    OP
       2022-12-06 14:32:33 +08:00




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

    应该是 Promise.all 然后才会并发执行吧?
    w292614191
        9
    w292614191  
    OP
       2022-12-06 15:23:29 +08:00
    如果是“立即执行” ,Promise.all 的意义是啥?结果都产生了。
    timethinker
        10
    timethinker  
       2022-12-06 15:26:20 +08:00
    Promise != Lazy ,你需要的更像是 Lazy
    timethinker
        11
    timethinker  
       2022-12-06 15:31:31 +08:00   ❤️ 1
    w292614191
        12
    w292614191  
    OP
       2022-12-06 15:44:47 +08:00
    @timethinker #11 学习了,非常感谢,我现在理解了。
    jadehare
        13
    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
        14
    Yeen  
       2022-12-06 21:14:25 +08:00
    你传给 promise 的异步回调本身并不能保证同步顺序。
    这个问题简化一下更好理解。你构造两个 promise ,都是 http 请求。你并不能保证哪个请求先返回。
    如果需要同步,要么在 then 串行起来;要么 await 同步。
    Yeen
        15
    Yeen  
       2022-12-06 21:19:26 +08:00
    @w292614191 立即执行不等于立即有结果。比如网络请求
    okakuyang
        16
    okakuyang  
       2022-12-07 00:22:37 +08:00
    可以在 for of 里用 awit 顺序执行
    ZoeeoZ
        17
    ZoeeoZ  
       2022-12-07 11:05:46 +08:00
    promise.all 我遇到过最迷幻的一次问题是: 里边的两个(校验表单的)函数调换一下顺序(比如 B,A)就永远走失败,但不调换(A,B)就正常,我调了 N 久才发现是这俩顺序的问题
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   6014 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 03:07 · PVG 11:07 · LAX 19:07 · JFK 22:07
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.