为何JavaScript函数内无法向目标字典添加指定键值对?
问题原因分析与解决方案
你的问题主要来自两个核心点:变量作用域冲突和异步操作的时序问题,咱们一个个拆解清楚:
1. 变量作用域被内部声明覆盖
在getPrice函数内部,你重新声明了var price = {},这会创建一个仅属于函数作用域的新变量,直接屏蔽了外部传入的price参数。也就是说,你在异步回调里修改的是这个内部的price对象,和全局的那个price根本不是同一个,自然看不到value键的变化。
2. 异步操作的时序不匹配
https.get是异步执行的——当你调用getPrice(price)后,JavaScript不会等待网络请求完成,会立刻跳去执行后面的console.log(price)。这时候异步请求还在后台处理,回调函数还没触发,value键自然还没被添加到对象里。
修复后的代码示例
方案1:用回调函数处理异步逻辑
var price = {}; function getPrice(price, callback) { const https = require('https'); var item = 'M4A1-S | Decimator (Field-Tested)'; var body = ''; // 去掉内部的var price = {},直接使用传入的对象 https.get('https://steamcommunity.com/market/priceoverview/?appid=730&market_hash_name=' + encodeURIComponent(item), res => { res.on('data', data => { body += data; }) res.on('end', () => { try { const medianPrice = JSON.parse(body).median_price; price['value'] = parseFloat(medianPrice.substr(1)); callback(null, price); // 异步完成后通知外部 } catch (err) { callback(err); } }); }).on('error', error => callback(error.message)); } price['test'] = "123"; getPrice(price, (err, result) => { if (err) { console.error(err); return; } console.log(result); // 这里才能拿到包含value的完整对象 });
方案2:用Promise + async/await(更简洁优雅)
var price = {}; function getPrice(price) { const https = require('https'); var item = 'M4A1-S | Decimator (Field-Tested)'; return new Promise((resolve, reject) => { var body = ''; https.get('https://steamcommunity.com/market/priceoverview/?appid=730&market_hash_name=' + encodeURIComponent(item), res => { res.on('data', data => { body += data; }) res.on('end', () => { try { const medianPrice = JSON.parse(body).median_price; price['value'] = parseFloat(medianPrice.substr(1)); resolve(price); } catch (err) { reject(err); } }); }).on('error', error => reject(error.message)); }); } price['test'] = "123"; // 用async/await等待异步操作完成 (async () => { try { const result = await getPrice(price); console.log(result); } catch (err) { console.error(err); } })();
额外提醒:记得用encodeURIComponent()处理item字符串,不然字符串里的特殊字符可能会导致请求URL格式错误哦。
内容的提问来源于stack exchange,提问作者jogge
相关产品推荐
相关产品推荐

