如何在含异步回调的内置方法循环中获取并返回数据
解决异步回调中收集数据并返回的问题
你遇到的核心问题是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
相关产品推荐
相关产品推荐

