如何在Promise中获取响应值与状态码,优化query返回逻辑?
解决方案
很简单,咱们只需要调整httpsGet函数的返回值,让它同时把响应状态码和内容一起传回来就行,完全不用全局变量。具体改法如下:
1. 修改httpsGet函数,返回状态码+响应体的组合
原来的httpsGet只返回了响应内容,现在让它resolve一个包含statusCode和body的对象,这样在query里就能同时拿到判断需要的两个关键信息:
const https = require('https'); function httpsGet(opts) { return new Promise((resolve, reject) => { const req = https.get(opts, (res) => { let body = ''; res.on('data', (data) => { body += data.toString(); }); res.on('end', () => { // 这里修改:返回包含状态码和响应体的对象 resolve({ statusCode: res.statusCode, body }); }); }); req.on('error', (e) => { console.error(e); reject(e); }); }); }
2. 在query函数里实现判断逻辑
现在await httpsGet(opt)会返回咱们需要的状态码和内容,直接解构后按照你的条件判断返回0或1即可;请求出错的话,catch块里返回0:
async function query(options) { options = options || {}; options.timeout = options.timeout || 0; const opt = { hostname: 'encrypted.google.com', port: 443, path: '/', method: 'GET', }; opt.agent = new https.Agent(opt); try { // 解构拿到状态码和响应体 const { statusCode, body } = await httpsGet(opt); // 按照你的判断逻辑返回0或1 return (statusCode === 301 && body.includes('google')) ? 1 : 0; } catch (error) { console.error(error); // 异常情况返回0 return 0; } }
测试代码不变
原来的自执行测试函数可以直接用,现在会输出0或1:
(async function () { const s = await query({ timeout: 1000 }); console.log('Result: ' + s); })();
这样改完之后,query()函数就只会返回0或1,完全符合你的要求,而且没有使用任何全局变量~
内容的提问来源于stack exchange,提问作者Sandra Schlichting
相关产品推荐
相关产品推荐

