Electron发起GET请求如何等待响应返回后再return避免得到undefined
问题根因
- 你在
if (info) resolve(info)之后没有终止逻辑,后续的reject()一定会执行,Promise状态一旦被reject覆盖,外部then不会触发,自然拿不到返回值 - 响应的
data事件可能触发多次(分块传输场景),直接解析单个chunk可能出现JSON解析错误,需要先拼接完整响应体再处理 - 没有监听
error事件捕获请求层面的异常,容易出现未处理的Promise rejection
修正后可运行代码
const { net } = require('electron') const URL = '替换为你的实际请求地址' let getInfo = async () => { return new Promise((resolve, reject) => { const request = net.request({ url: URL, method: 'GET' }) // 捕获请求级错误 request.on('error', (err) => { reject(err) }) request.on('response', (response) => { let chunks = [] // 拼接所有响应块 response.on('data', (chunk) => { chunks.push(chunk) }) // 响应完全接收后再处理数据 response.on('end', () => { try { let body = JSON.parse(Buffer.concat(chunks).toString()) let info = body.data if (info) { resolve(info) } else { reject(new Error('响应中无有效data字段')) } } catch (parseErr) { reject(parseErr) } }) // 捕获响应级错误 response.on('error', (err) => { reject(err) }) }) request.end() }).then(data => { console.log("From then: " + data) return data }) } // 外部调用增加catch捕获异常 getInfo().then(data => { console.log("From outside: " + data) }).catch(err => { console.error("请求出错: ", err) })
关键调整说明
- 把Promise的resolve/reject逻辑移到
response.on('end')事件中,确保完整接收所有响应数据后再处理 - 补充了请求、响应、JSON解析三个层面的错误捕获,避免未处理异常
- resolve后不会再执行reject逻辑,Promise状态稳定,外部
then可以正常拿到返回值 - 适配分块传输场景,不会出现JSON解析失败的问题
内容的提问来源于stack exchange,提问作者Bazoogle
相关产品推荐
相关产品推荐

