V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
leehowlslee
V2EX  ›  程序员

前端 JS 异步问题请教

  •  
  •   leehowlslee · 313 天前 via Android · 2838 次点击
    这是一个创建于 313 天前的主题,其中的信息可能已经有所发展或是发生改变。
    VUE3 的项目中有一个 a 方法里面有几百个异步和非异步方法,每个子方法里又有很多方法(异步和非异步)。
    我想在 a 方法里面全部子方法执行完成后再进行操作,我要怎么找到这个时间点呢?
    12 条回复    2024-01-23 08:58:12 +08:00
    musi
        1
    musi  
       313 天前 via iPhone
    建议重构代码
    yggd
        2
    yggd  
       313 天前
    Promise.all
    crysislinux
        3
    crysislinux  
       313 天前 via Android
    实在不想重构的话。加一个方法,每执行一个 a 里面的方法就计数加 1 ,到所有方法的数量后就 call 你想做的操作。
    crysislinux
        4
    crysislinux  
       313 天前 via Android
    话说你这异步的都没有 await 么。不然你要的时间点不是很自然么。
    okakuyang
        5
    okakuyang  
       313 天前
    这个问题非常好,可以深度挖掘一下。通过查找父函数调用的所有子函数的名称取得所有子函数名,对所有子函数使用代理修改行为,最后通过计数的方式获取到所有子函数执行完的时间点。
    totoro52
        6
    totoro52  
       313 天前
    我的建议是,丢给 gpt
    jiangzm
        7
    jiangzm  
       313 天前
    主要是异步方法, 建议传回调方法,在 a 方法关键位置回调
    codehz
        8
    codehz  
       313 天前
    首先你肯定得重构代码,我这里提供一个较为简单的方案
    开一个池子
    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  
       313 天前
    异步处理的实现太多了:
    1 、Promise.all
    2 、async 、await
    3 、async 库
    4 、RxJS ,可以使用诸如 combineLatest 等方法
    Chuckle
        10
    Chuckle  
       313 天前
    这个 a 方法返回啥,返回 promise 那就 await 就行了,子方法都是 promise 那就 Promise.all()等所有子方法完成。
    要是 a 里就是几百个定时器啊、请求啊之类的异步任务,乱糟糟。。。。那没办法了,改代码吧,用生成器。。。往一个个小异步任务结束位置里塞 next(),生成器里用同样数量的 yield 接一下。
    bianhui
        11
    bianhui  
       312 天前
    在所有方法调用完之后,.then 不就好了么
    lsk569937453
        12
    lsk569937453  
       312 天前
    能不用 promise 就不用 promise ,理解起来太难了,async 香的很。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1116 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 23:46 · PVG 07:46 · LAX 15:46 · JFK 18:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.