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
相关产品推荐
相关产品推荐

