JavaScript中无法等待async异步调用获取AWS响应结果怎么解决
问题根因
- 你编写的
handleResponse虽然标记为async函数,但并没有等待data、end事件触发就直接返回了初始值为空的responseBody,await收到的是还未组装完成的响应值,事件回调内部的return不会向外层函数传递返回值,所以最终拿到的结果不符合预期。 - 事件监听属于回调模式,无法直接被
async/await识别,必须先封装为Promise才能用同步写法获取异步结果。
修复方案
第一步:重写handleResponse,封装为Promise
const handleResponse = (response) => { return new Promise((resolve, reject) => { let responseBody = ""; response.on("data", (chunk) => { responseBody += chunk; }); response.on("end", () => { // 接收完成后返回组装好的响应内容 resolve(responseBody); }); response.on("error", (err) => { // 处理请求异常 reject(err); }); }); };
调整后getLoadIds的写法不需要修改,await handleResponse(payload)就可以拿到正确的响应结果。
第二步:适配AWS HttpClient调用逻辑
AWS的client.handleRequest默认不会等待传入的异步回调执行完成,如果你需要外层await等待整个请求+响应处理逻辑完成,需要把调用逻辑也做一层Promise封装:
var client = new AWS.HttpClient(); try { await new Promise((resolve, reject) => { client.handleRequest( request, null, async (res) => { try { await fn(res); resolve(); } catch (err) { reject(err); } }, // handleRequest第四参数为请求错误回调,必须注册避免异常无法捕获 (err) => reject(err) ); }); } catch (err) { // 全局处理请求异常 console.error(err); }
内容的提问来源于stack exchange,提问作者Ryan
相关产品推荐
相关产品推荐

