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

为何在Node.js异步函数中无法返回对象数组?

解决异步函数返回undefined的问题

问题根源分析

  1. await使用无效:bookTickers是回调风格的API,并非返回Promise的函数,所以外层的await无法等待其回调执行完成,symbolPrice函数会直接执行完毕,返回undefined。
  2. 返回值作用域错误:回调函数内的return results只是回调自身的返回值,并非symbolPrice函数的返回值,外层函数根本无法获取这个结果。
  3. Promise.all误用:symbolList中的元素都是普通对象,不是Promise实例,Promise.all在这里完全没有意义。
  4. 变量副作用问题:symbolObj在forEach循环中被重复赋值,且无论是否满足筛选条件都会被push到数组,可能混入空对象;同时复用同一个对象引用,会导致数组内元素最终都是最后一次赋值的对象。
  5. 参数不匹配: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 04:20:31