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

EventListener回调中函数未异步执行,提交按钮需点击两次才生效

问题原因

fetch 属于异步网络请求API,getValues 执行后不会等待接口返回结果,会直接执行后续的valuesToChange函数,此时表单输入值还没有被接口返回的新数据覆盖,所以第一次点击时汇总计算使用的是旧值,只有第二次点击时,前一次请求已经完成并更新了表单值,才能得到正确结果。

修复方案

方案1:等待异步请求完成后再执行汇总计算

只需要修改提交按钮的点击回调逻辑即可,两种写法二选一:

async/await写法(推荐,可读性更高)

mySubmit.addEventListener('click', async () => {
  // 等待API请求完成、表单值更新后再执行计算
  await getValues(0);
  valuesToChange();
});

Promise.then写法

mySubmit.addEventListener('click', () => {
  getValues(0).then(() => {
    valuesToChange();
  });
});

方案2:复用已有keyup事件逻辑(可选优化)

如果后续需要适配多输入框的批量更新,可以在修改输入值后手动触发keyup事件,不用单独调用计算函数,修改getValues逻辑即可:

const getValues = APIIndex =>
  fetch('https://api.com')
    .then(response => response.json())
    .then(json => {
      formInput.value = `${parseFloat(json.prop[APIIndex].price).toFixed(2)}`;
      // 手动触发keyup事件,复用原有绑定的计算逻辑
      formInput.dispatchEvent(new Event('keyup'));
    })
    .catch(error => console.log('Error'));

修改完成后点击一次按钮即可完成接口拉取、数值更新、汇总计算全流程,和用户手动输入的效果完全一致。


内容的提问来源于stack exchange,提问作者BuiltByDan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 01:54:04