Tampermonkey中函数无法获取XMLHttpRequest返回值,日志输出undefined
解决XMLHttpRequest异步结果获取问题
核心问题
你遇到的是异步操作的时序问题:XMLHttpRequest是异步执行的,weatherPull函数会在请求发送后立刻返回,此时请求还没完成,自然拿不到结果,所以kaminoan里打印的是undefined。
解决方案:用Promise包裹XHR请求
把weatherPull改造成返回Promise的函数,这样就能通过async/await或者.then()来等待请求完成:
function weatherPull() { return new Promise((resolve, reject) => { const xhr = new XMLHttpRequest(); xhr.open('GET', '你的请求URL', true); // 替换成实际请求地址 xhr.onload = function() { if (xhr.status >= 200 && xhr.status < 300) { // 这里替换成你实际提取degreesInner的逻辑 const degreesInner = 从响应中解析数据(xhr.responseText); resolve(degreesInner); // 请求成功时返回结果 } else { reject(new Error(`请求失败,状态码:${xhr.status}`)); } }; xhr.onerror = function() { reject(new Error('网络请求出错')); }; xhr.send(); }); }
用async/await获取结果
在kaminoan函数里,通过async/await等待weatherPull的Promise完成:
async function kaminoan() { try { const result = await weatherPull(); console.log(result); // 这里就能拿到正确的degreesInner了 } catch (error) { console.error('获取天气数据失败:', error); } } // 调用函数 kaminoan();
替代方案:用.then()链式调用
如果不想用async/await,也可以用Promise的.then()方法处理结果:
function kaminoan() { weatherPull() .then(result => { console.log(result); }) .catch(error => { console.error('获取天气数据失败:', error); }); } kaminoan();
关键说明
- Promise的作用是把异步操作的结果"包装"成可等待的对象,
resolve传递成功结果,reject传递错误信息。 async/await是Promise的语法糖,让异步代码写法更接近同步逻辑,可读性更强。- 必须处理错误(
try/catch或者.catch()),避免请求失败时无反馈。
内容的提问来源于stack exchange,提问作者user19102374
相关产品推荐
相关产品推荐

