为何在Node.js异步函数中无法返回对象数组?
解决异步函数返回undefined的问题
问题根源分析
await使用无效:bookTickers是回调风格的API,并非返回Promise的函数,所以外层的await无法等待其回调执行完成,symbolPrice函数会直接执行完毕,返回undefined。- 返回值作用域错误:回调函数内的
return results只是回调自身的返回值,并非symbolPrice函数的返回值,外层函数根本无法获取这个结果。 Promise.all误用:symbolList中的元素都是普通对象,不是Promise实例,Promise.all在这里完全没有意义。- 变量副作用问题:
symbolObj在forEach循环中被重复赋值,且无论是否满足筛选条件都会被push到数组,可能混入空对象;同时复用同一个对象引用,会导致数组内元素最终都是最后一次赋值的对象。 - 参数不匹配:
symbolPrice定义时未声明参数,但调用时传入了三个参数,代码中用到的starts变量未定义,会导致筛选逻辑失效。
修正后的代码
// 将回调式的bookTickers包装为Promise版本,适配await语法 const bookTickersPromise = () => { return new Promise((resolve, reject) => { bookTickers((error, ticker) => { error ? reject(error) : resolve(ticker); }); }); }; const symbolPrice = async(starts) => { // 等待行情数据返回 const ticker = await bookTickersPromise(); // 用filter+map直接筛选并转换数据,避免forEach的副作用 const symbolList = ticker .filter(symbol => symbol.symbol.toUpperCase().startsWith(starts.toUpperCase())) .map(symbol => ({ symbol: symbol.symbol, bid: symbol.bidPrice, ask: symbol.askPrice })); return symbolList; }; const symbolPriceTest = async() => { // 传入正确的筛选前缀参数 const res = await symbolPrice('ETH'); console.log(res); };
修正说明
- 回调转Promise:通过
new Promise包装bookTickers,让其支持await语法,确保symbolPrice会等待数据返回后再继续执行。 - 正确返回结果:直接在
symbolPrice函数体内返回处理后的数组,而非在回调内部返回。 - 无副作用数据处理:用
filter筛选符合条件的币种,再用map转换为目标对象结构,避免变量重复赋值和无效push的问题。 - 参数匹配:给
symbolPrice添加starts参数,调用时传入正确的筛选前缀,解决变量未定义问题。
内容的提问来源于stack exchange,提问作者David Williams
相关产品推荐
相关产品推荐

