#javascript
Вопрос:
У меня есть звонок в AWS, где я получаю ответ, и обратный вызов выглядит так:
const handleResponse = async (response) => {
var responseBody = "";
response.on("data", async function (chunk) {
responseBody = chunk;
});
response.on("end", async function (chunk) {
return responseBody;
});
return responseBody;
};
Моя текущая попытка состоит в том, чтобы вызвать эту функцию с ожиданием, подобным такому:
const getLoadIds = async (payload) => {
// console.log(payload);
const resp = await handleResponse(payload)
console.log(resp) <--- this is undefined
}
Как я могу получить ответ от вызова response.on(«завершение»)?
Вот исходный код вызывающего абонента:
var client = new AWS.HttpClient();
try {
await client.handleRequest(request, null, async (res) => fn(res));
} catch (err) {
fn
является псевдонимом для getLoadIds
Комментарии:
1.
handleResponse
ничего не делает асинхронно… Он просто немедленно возвращает пустую строку.2. Это потому, что вы сразу же возвращаетесь из
handleResponse
. Чтобы сделать это, удалите асинхронность из функции, а затем вместоhandleResponse
этого верните обещаниеresponseBody
, которое будет выполнено, когдаend
произойдет событие. Удалите асинхронность из ваших обратных вызовов.3. @AndrewLi Вы не могли бы опубликовать пример этого потока?
Ответ №1:
Возможно, вы захотите иметь что-то вроде
const handleResponse = (response) => {
return new Promise((resolve) => {
var responseBody = "";
response.on("data", function (chunk) {
responseBody = chunk;
});
response.on("end", function (chunk) {
resolve(responseBody);
});
});
};
upd: спасибо @Andrew Li, заметил ошибку в ответе
Комментарии:
1. Однако не забывайте об обработке ошибок
Ответ №2:
Заверните обработчик потока в обещание. resolve
он возвращает данные, и reject
если в нем есть ошибка.
function handleResponse() {
let responseBody = '';
return new Promise((res, rej) => {
response.on('data', (chunk) => responseBody = chunk);
response.on('end', () => res(responseBody));
response.on('error', (error) => rej(error));
});
};
function getLoadIds(payload) {
const resp = await handleResponse(payload);
console.log(resp);
}