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

如何在含异步回调的内置方法循环中获取并返回数据

解决异步回调中收集数据并返回的问题

你遇到的核心问题是db.get属于异步回调操作,同步返回result时,异步的push逻辑还未执行,所以得到的是空数组。以下是几种可行的解决方法:

方法一:Promise封装 + Promise.all(推荐)

先把回调式的db.get封装为Promise,再用Promise.all等待所有异步操作完成后返回结果:

const db = require('db')

// 封装db.get为Promise版本
function getDbData(key) {
  return new Promise((resolve, reject) => {
    db.get(key, (err, value) => {
      if (err) reject(err)
      else resolve({ key, value })
    })
  })
}

async function test() {
  const arr = [1,2,3,4,5]
  // 生成所有异步查询的Promise数组
  const promiseArr = arr.map(key => getDbData(key))
  // 等待所有Promise完成,获取最终结果数组
  const result = await Promise.all(promiseArr)
  return result
}

// 使用示例:
// test().then(data => console.log(data)).catch(err => console.error(err))

方法二:直接在map中创建Promise

如果不想单独封装函数,可直接在数组循环内创建Promise:

const db = require('db')

async function test() {
  const arr = [1,2,3,4,5]
  const result = await Promise.all(arr.map(key => {
    return new Promise((resolve, reject) => {
      db.get(key, (err, value) => {
        if (err) reject(err)
        else resolve({ key, value })
      })
    })
  }))
  return result
}

方法三:传统回调方式

如果项目仍采用回调风格,可为test函数添加回调参数:

const db = require('db')

function test(callback) {
  const arr = [1,2,3,4,5]
  const result = []
  let completedCount = 0

  arr.forEach(key => {
    db.get(key, (err, value) => {
      if (err) {
        // 出错时直接返回错误
        return callback(err)
      }
      result.push({ key, value })
      completedCount++
      // 所有异步操作完成后返回结果
      if (completedCount === arr.length) {
        callback(null, result)
      }
    })
  })
}

// 使用示例:
// test((err, data) => {
//   if (err) console.error(err)
//   else console.log(data)
// })

注意事项

  • 原代码中arr.map里的key未定义,示例中已修正为使用循环的val(即数组元素)作为查询key。
  • 异步版本的test函数返回的是Promise,调用时需通过.then()或await获取结果。

内容的提问来源于stack exchange,提问作者rusli Abdul gani

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 15:11:13