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

Node.js新手求助:异步函数中无法为对象添加键值对

问题分析与解决方案

嘿,我来帮你搞定这个问题~你遇到的其实是Node.js里很常见的异步操作执行顺序问题,咱们一步步拆解:

为什么"e"没被输出?

你代码里的binance.prices()是一个异步函数——它会发送请求去Binance获取数据,这个过程需要时间,JavaScript不会等着它完成,而是直接继续执行后面的for (field in _addField)循环。这时候回调函数里的_addField["e"] ="f"还没来得及执行呢,所以遍历的时候自然只有a和c两个键。

两种解决办法

方法1:把遍历逻辑放到异步回调内部

既然要等回调里的代码执行完才能拿到完整的_addField,那直接把输出遍历的代码移到回调函数里就行:

const binance = require('node-binance-api');
// 省略前面的if代码块
else if (/* 你的判断条件 */) {
  var _addField = {};
  _addField["a"] = "b";
  _addField["c"] = "d";
  
  binance.prices((error, ticker) => {
    for (var obj in ticker) {
      if (obj.includes(coin + `USDT`)) {
        _addField["e"] = "f";
      }
    }
    // 这里遍历,确保e已经被添加
    for (field in _addField) {
      console.log(field);
    }
  });
}

方法2:用async/await简化异步逻辑

如果不想写嵌套的回调,用async/await会让代码更清晰(node-binance-api的方法在不传回调时会返回Promise,刚好支持这个写法):

const binance = require('node-binance-api');
// 省略前面的if代码块
else if (/* 你的判断条件 */) {
  var _addField = {};
  _addField["a"] = "b";
  _addField["c"] = "d";
  
  // 用自执行的async函数包裹,支持await语法
  (async () => {
    try {
      // 等待Binance返回数据
      const ticker = await binance.prices();
      for (var obj in ticker) {
        if (obj.includes(coin + `USDT`)) {
          _addField["e"] = "f";
        }
      }
      // 现在遍历就能拿到所有键了
      for (field in _addField) {
        console.log(field);
      }
    } catch (error) {
      // 别忘了处理错误
      console.error('获取行情数据失败:', error);
    }
  })();
}

小提醒

Node.js里涉及网络请求、文件读写这类IO操作的函数基本都是异步的,一定要注意代码的执行顺序——不要在异步操作外面直接使用异步操作里修改的数据,必须等异步操作完成后再处理哦~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:01:42