前端 JS 异步问题请教 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回技术问题时复制粘贴 AI 生成的内容
leehowlslee
V2EX    程序员

前端 JS 异步问题请教

  •  
  •   leehowlslee 2024-01-22 22:10:23 +08:00 via Android 3373 次点击
    这是一个创建于 708 天前的主题,其中的信息可能已经有所发展或是发生改变。
    VUE3 的项目中有一个 a 方法里面有几百个异步和非异步方法,每个子方法里又有很多方法(异步和非异步)。
    我想在 a 方法里面全部子方法执行完成后再进行操作,我要怎么找到这个时间点呢?
    12 条回复    2024-01-23 08:58:12 +08:00
    musi
        1
    musi  
       2024-01-22 22:12:46 +08:00 via iPhone
    建议重构代码
    yggd
        2
    yggd  
       2024-01-22 22:15:19 +08:00
    Promise.all
    crysislinux
        3
    crysislinux  
       2024-01-22 22:32:22 +08:00 via Android
    实在不想重构的话。加一个方法,每执行一个 a 里面的方法就计数加 1 ,到所有方法的数量后就 call 你想做的操作。
    crysislinux
        4
    crysislinux  
       2024-01-22 22:34:22 +08:00 via Android
    话说你这异步的都没有 await 么。不然你要的时间点不是很自然么。
    okakuyang
        5
    okakuyang  
       2024-01-22 22:56:03 +08:00
    这个问题非常好,可以深度挖掘一下。通过查找父函数调用的所有子函数的名称取得所有子函数名,对所有子函数使用代理修改行为,最后通过计数的方式获取到所有子函数执行完的时间点。
    MIUIOS
        6
    MIUIOS  
       2024-01-22 23:50:16 +08:00
    我的建议是,丢给 gpt
    jiangzm
        7
    jiangzm  
       2024-01-22 23:57:05 +08:00
    主要是异步方法, 建议传回调方法,在 a 方法关键位置回调
    codehz
        8
    codehz  
       2024-01-23 00:17:53 +08:00
    首先你肯定得重构代码,我这里提供一个较为简单的方案
    开一个池子
    class MyPromisePool {
    #data: Promise<void>[] = [];
    add(promise: Promise<void>) { this.#data.push(promise); }
    async [Symbol.asyncDispose]() {
    await Promise.all(this.#data);
    }
    }
    在顶层函数使用,例如
    async function entry() {
    await using pool = new MyPromisePool();
    //需要的时候就往 pool 里塞 promise
    pool.add(asyncfn());
    //尾部不用手动写其他代码,ts 会帮你生成合适的代码
    //会自动调用 Promise.all 去等待结束
    //侵入性更小* (意味着不需要去跟踪函数是怎么结束的,你直接写 return 就好
    }
    fuyun
        9
    fuyun  
       2024-01-23 00:19:53 +08:00
    异步处理的实现太多了:
    1 、Promise.all
    2 、async 、await
    3 、async 库
    4 、RxJS ,可以使用诸如 combineLatest 等方法
    Chuckle
        10
    Chuckle  
       2024-01-23 03:30:14 +08:00
    这个 a 方法返回啥,返回 promise 那就 await 就行了,子方法都是 promise 那就 Promise.all()等所有子方法完成。
    要是 a 里就是几百个定时器啊、请求啊之类的异步任务,乱糟糟。。。。那没办法了,改代码吧,用生成器。。。往一个个小异步任务结束位置里塞 next(),生成器里用同样数量的 yield 接一下。
    bianhui
        11
    bianhui  
       2024-01-23 08:22:23 +08:00
    在所有方法调用完之后,.then 不就好了么
    lsk569937453
        12
    lsk569937453  
       2024-01-23 08:58:12 +08:00
    能不用 promise 就不用 promise ,理解起来太难了,async 香的很。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3451 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 10:11 PVG 18:11 LAX 02:11 JFK 05:11
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86