Node.js/Nest中遍历异步函数对象时异步行为异常问题
异步函数行为差异的核心原因
问题本质:函数执行时机的不同
你遇到的差异完全是因为异步函数的执行时机不一样:
对象映射写法的问题
当你写serializationByService: { key1: this.Func1(data), key2: this.Func2(data) }时,这两个函数在对象创建的瞬间就已经被调用了——Func1和Func2对应的Promise直接启动异步执行,跟后面的循环await没关系。循环里的await serializationByService[key]只是在等已经跑起来的Promise完成,但如果你的逻辑是想“先等第一个函数做完再做第二个”,这里就完全不符合预期:两个函数其实是并行跑的,可能第二个函数先跑完,导致日志打印顺序和你预想的不一样,看起来像是“日志在函数返回前执行”。循环内直接await的正确逻辑
换成await this.Func1(data)时,函数是在循环的每一轮才被调用的——等第一个函数的Promise完全resolve后,才会执行下一轮循环里的第二个函数,全程是顺序执行的,所以异步行为完全符合你的预期。
举个直观例子
假设Func1耗时2秒,Func2耗时1秒:
- 对象映射写法:创建对象时两个函数同时启动,1秒后
Func2就跑完了,2秒后Func1才完成。循环里先等key1(2秒),此时Func2的结果早就出来了,打印时会直接输出; - 循环内直接await:先跑
Func1等2秒,打印结果后再跑Func2等1秒,完全按顺序来。
修复方案(如果需要顺序执行)
如果你的业务需要顺序执行这些异步函数,应该把函数本身存在对象里,而不是调用后的Promise:
const keys = [key1, key2] // 存储函数引用,不立即执行 const serializationByService: Record<string, () => Promise<returnFromFunc1 | returnFromFunc2>> = { key1: () => this.Func1(data), key2: () => this.Func2(data) } for (const key of keys) { // 循环时才调用函数并等待结果 const serviceData = await serializationByService[key](); console.log(serviceData) // ... 其他操作 }
内容的提问来源于stack exchange,提问作者Sylvain.L
相关产品推荐
相关产品推荐

