Promise输出含Promise{}包裹,如何获取纯JSON结果并在外部使用?
解决Promise结果无法在外部使用的问题
这事儿核心是JavaScript异步代码的执行顺序在搞鬼,我帮你一步步理清楚:
为什么会出现Promise {}和变量未定义的问题?
直接打印
info显示Promise {}:
你创建的info本身就是一个Promise对象,它代表的是一个还在进行(或者已经完成)的异步操作,不是直接的返回数据。要拿到里面的结果,必须通过.then()或者async/await来提取resolved的值。为什么
console.log(jsonfile)提示未定义?.then()里的代码是异步执行的,当你同步执行console.log(jsonfile)的时候,.then()里的赋值操作还没来得及运行(因为网络请求还没完成),所以变量根本还没被创建,自然提示未定义。
两种可行的解决办法
办法一:把后续操作放进.then()链里
既然异步代码会在请求完成后执行,那所有依赖这个数据的操作都要放在.then()里面或者后续的.then()链中:
const info = new Promise((resolve, reject) => { var req = require('request'); var options = { url: 'https://api.info.com/', headers: { 'User-Agent': 'request' } }; req(options, function (err, response, body) { if (!err && response.statusCode === 200) { resolve(JSON.parse(body)); } else { // 别忘了处理错误情况 reject(err || new Error('请求失败')); } }); }); info.then(function(value) { const jsonfile = value; // 在这里做所有需要用到jsonfile的查询操作 console.log(jsonfile); // 这里能正常输出纯JSON数组 // 比如调用处理函数 runMyQueries(jsonfile); }).catch(function(error) { // 捕获请求过程中的错误 console.error('出问题了:', error); }); function runMyQueries(data) { // 你的其他查询逻辑写在这里 }
办法二:用async/await让异步代码看起来像同步代码
这是现在更推荐的写法,代码结构更清晰,await必须放在async函数里面:
const info = new Promise((resolve, reject) => { var req = require('request'); var options = { url: 'https://api.info.com/', headers: { 'User-Agent': 'request' } }; req(options, function (err, response, body) { if (!err && response.statusCode === 200) { resolve(JSON.parse(body)); } else { reject(err || new Error('请求失败')); } }); }); async function handleData() { try { // 等待Promise完成,拿到结果 const jsonfile = await info; console.log(jsonfile); // 这里就是纯JSON数组 // 在这里执行你的其他查询操作 runMyQueries(jsonfile); } catch (error) { // 处理错误 console.error('请求出错:', error); } } // 调用这个async函数 handleData();
如果是Node.js 14.8及以上版本,还可以直接在模块顶层用await,不用包裹函数:
// 顶层await(Node.js 14.8+) try { const jsonfile = await info; console.log(jsonfile); runMyQueries(jsonfile); } catch (err) { console.error(err); }
额外提醒:request库已被弃用
你现在用的request库已经停止维护了,建议换成node-fetch或者axios这些仍在更新的库,比如用node-fetch重写的话:
const fetch = require('node-fetch'); async function fetchData() { try { const response = await fetch('https://api.info.com/', { headers: { 'User-Agent': 'request' } }); if (!response.ok) throw new Error(`请求失败,状态码:${response.status}`); const jsonfile = await response.json(); console.log(jsonfile); runMyQueries(jsonfile); } catch (error) { console.error(error); } } fetchData();
内容的提问来源于stack exchange,提问作者Felipe Costa Goes
相关产品推荐
相关产品推荐

