前端 JS 异步问题请教

108 天前
 leehowlslee
VUE3 的项目中有一个 a 方法里面有几百个异步和非异步方法,每个子方法里又有很多方法(异步和非异步)。
我想在 a 方法里面全部子方法执行完成后再进行操作,我要怎么找到这个时间点呢?
2603 次点击
所在节点    程序员
12 条回复
musi
108 天前
建议重构代码
yggd
108 天前
Promise.all
crysislinux
108 天前
实在不想重构的话。加一个方法,每执行一个 a 里面的方法就计数加 1 ,到所有方法的数量后就 call 你想做的操作。
crysislinux
108 天前
话说你这异步的都没有 await 么。不然你要的时间点不是很自然么。
okakuyang
108 天前
这个问题非常好,可以深度挖掘一下。通过查找父函数调用的所有子函数的名称取得所有子函数名,对所有子函数使用代理修改行为,最后通过计数的方式获取到所有子函数执行完的时间点。
totoro52
108 天前
我的建议是,丢给 gpt
jiangzm
107 天前
主要是异步方法, 建议传回调方法,在 a 方法关键位置回调
codehz
107 天前
首先你肯定得重构代码,我这里提供一个较为简单的方案
开一个池子
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
107 天前
异步处理的实现太多了:
1 、Promise.all
2 、async 、await
3 、async 库
4 、RxJS ,可以使用诸如 combineLatest 等方法
Chuckle
107 天前
这个 a 方法返回啥,返回 promise 那就 await 就行了,子方法都是 promise 那就 Promise.all()等所有子方法完成。
要是 a 里就是几百个定时器啊、请求啊之类的异步任务,乱糟糟。。。。那没办法了,改代码吧,用生成器。。。往一个个小异步任务结束位置里塞 next(),生成器里用同样数量的 yield 接一下。
bianhui
107 天前
在所有方法调用完之后,.then 不就好了么
lsk569937453
107 天前
能不用 promise 就不用 promise ,理解起来太难了,async 香的很。

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

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

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

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

© 2021 V2EX