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

为何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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 14:12:41