You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在异步函数中实现变量自增?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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 18:33:32