如何在异步函数中实现变量自增?Promise内loopVal无法递增的解决方案
问题原因
你每次调用hi函数时,都会重新创建一个独立的loopVal变量,两次调用完全隔离,所以自增操作不会影响到下一次调用。另外,你在resolve()之后才执行loopVal++,就算变量是共享的,这次自增也不会影响当前的输出(因为输出已经执行了)。
解决方法
把loopVal的声明移到hi函数外部,让它成为闭包变量,这样所有hi的调用都会共享这个变量:
let loopVal = 1; // 移到hi函数外面 const hi = function(delay) { return new Promise((resolve, reject) => { setTimeout(() => { console.log("Resolved Successfully", loopVal); loopVal++; // 先输出再自增,和原逻辑一致 resolve(); }, delay) }) } const bye = async() => { await hi(1000); await hi(1000); return "bye"; } bye().then((value) => console.log(value));
这样两次调用hi时,第一次输出1然后自增到2,第二次输出2再自增到3,就能实现你要的自增效果。
如果不想让loopVal暴露在全局作用域,可以用IIFE把它封装起来:
const hi = (() => { let loopVal = 1; // 封装在闭包里,外部无法访问 return function(delay) { return new Promise((resolve, reject) => { setTimeout(() => { console.log("Resolved Successfully", loopVal); loopVal++; resolve(); }, delay) }) } })(); const bye = async() => { await hi(1000); await hi(1000); return "bye"; } bye().then((value) => console.log(value));
这样loopVal只会在hi的闭包内部存在,不会污染全局作用域。
内容的提问来源于stack exchange,提问作者JAVID ASHWAQ F
相关产品推荐
相关产品推荐

