NodeJS回调未等待执行:如何等待GET请求响应后执行后续步骤
搞定异步GET请求的等待问题
嘿,看你的代码,你是想让getListOfChannels函数等GET请求拿到响应后,再执行下一步操作对吧?我给你两种实用的方案,按需选就行~
方案1:把回调用对(适合继续用现有request库的情况)
你已经在函数里加了callback参数,但目前的代码没在请求完成后调用它——这就是关键!我们要把请求的结果或者错误传递给回调,这样调用函数的时候,就能在回调里写后续逻辑了。
修复后的代码是这样的:
getListOfChannels: function(token, callback) { var Channels = []; var options = { method: 'GET', url: url, // 记得这里要确保url是已经定义好的变量哦 headers: { 'x-api-key': token } }; request(options, function(error, response, body) { if (error) { // 别直接throw,把错误传给回调让调用者处理 return callback(error); } try { var json = JSON.parse(body); var data = json.MemberEntitlement; for (var i = 0; i < data.length; i++) { // 这里补全你的判断条件,比如筛选Entitled为true的频道 if (data[i].Entitled) { Channels.push(data[i]); } } // 请求处理完啦,把结果传给回调 callback(null, Channels); } catch (parseError) { // 捕获JSON解析的错误,同样传给回调 callback(parseError); } }); }
调用的时候这么写,后续操作就会等请求完成再执行:
getListOfChannels('你的token', function(error, channels) { if (error) { console.error('获取频道列表失败:', error); return; } // 这里就是请求完成后要做的事 console.log('拿到的频道:', channels); // 比如渲染页面、存到数据库啥的 });
方案2:换成Promise+async/await(更推荐,代码更清爽)
旧的request库已经不维护啦,如果能换成现代HTTP库(比如axios)或者把request包装成Promise,用async/await写代码会像同步逻辑一样好读。
先给request套个Promise外壳:
getListOfChannels: function(token) { return new Promise((resolve, reject) => { var Channels = []; var options = { method: 'GET', url: url, headers: { 'x-api-key': token } }; request(options, function(error, response, body) { if (error) { return reject(error); } try { var json = JSON.parse(body); var data = json.MemberEntitlement; for (var i = 0; i < data.length; i++) { if (data[i].Entitled) { Channels.push(data[i]); } } resolve(Channels); } catch (parseError) { reject(parseError); } }); }); }
然后用async/await调用,简直不要太直观:
async function handleChannels() { try { const channels = await getListOfChannels('你的token'); // 这里就是请求完成后的下一步 console.log('拿到的频道:', channels); // 后续操作随便写 } catch (error) { console.error('出问题啦:', error); } } // 调用这个异步函数 handleChannels();
额外推荐:换成axios(更省心)
既然request已经废弃,不如直接用axios,它默认支持Promise,代码更简洁:
// 先装axios:npm install axios const axios = require('axios'); getListOfChannels: async function(token) { try { const response = await axios.get(url, { headers: { 'x-api-key': token } }); // 用filter替代for循环,更简洁 const Channels = response.data.MemberEntitlement.filter(item => item.Entitled); return Channels; } catch (error) { throw new Error(`获取频道失败:${error.message}`); } }
调用方式和上面的async/await一样,逻辑清晰得很~
内容的提问来源于stack exchange,提问作者Kandarp Gandhi
相关产品推荐
相关产品推荐

