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

异步函数未等待变量填充完成即执行的问题求助

异步Promise未等待导致的数据填充问题解决方案

问题核心

你的代码中registar_compra函数里的console.log(params)输出的RequestItems.HISTORICO并非预期的结构化数据,而是一组Promise对象。原因是create_params函数中使用async回调的map方法时,map不会等待异步操作完成,直接返回Promise数组,且你没有等待这些Promise解析就返回了结果。

解决方案

需要用Promise.all等待map生成的所有Promise完成解析,再将结果赋值给对应的字段。修改后的代码如下:

export async function registar_compra(compra) {
  const params = await create_params(compra)
  console.log(params)
}

async function create_params(compra) {
  const { numero_socio, nome_tuna, nome_completo, produtos_selecionados } = compra

  // 等待所有异步生成的PutRequest对象解析完成
  const historicoItems = await Promise.all(
    produtos_selecionados.map(async (produto, index) => ({
      PutRequest: {
        Item: {
          id: "compra",
          data_dia: await get_data(index),
          numero_socio: numero_socio,
          nome_tuna: nome_tuna,
          nome_completo: nome_completo,
          quantidade: produto.quantidade,
          nome_produto: produto.nome_produto,
          preco_quantidade: produto.preço_quantidade
        }
      }
    }))
  )

  const result = {
    RequestItems: {
      ['HISTORICO']: historicoItems
    }
  }

  return result
}

function get_data(index) {
  return new Promise(resolve => {
    setTimeout(() => {
      resolve(new Date().toISOString());
    }, 12 * index);
  });
}

关键修改说明

  • produtos_selecionados.map(async...)会返回一个Promise数组,每个Promise对应一个带data_dia的PutRequest对象
  • 使用await Promise.all(...)等待所有Promise完成解析,得到实际的对象数组
  • 将解析后的数组赋值给RequestItems.HISTORICO,确保返回的result中所有数据都已填充完成

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 07:05:33