Мне нужно реализовать отменяемый клиентский HTTP-запрос в Node.js без использования внешних библиотек.Я даю объект Promise
- cancellationPromise
- который отклоняется при внешнем запросе отмены.Вот откуда я знаю, что мне, возможно, потребуется позвонить request.abort()
.
Вопрос в том, должен ли я звонить request.abort()
только в том случае, если https.request
все еще находится на рассмотрении, а response
объект еще не доступен?
Или, еслиЯ буду вызывать его, даже если я уже получил объект response
и обрабатываю данные ответа, как в коде ниже?В этом случае это остановит больше response.on('data')
событий от прихода?
async simpleHttpRequest(url, oauthToken, cancellationPromise) {
let cancelled = null;
let oncancel = null;
cancellationPromise.catch(error => {
cancelled = error; oncancel && oncancel(error) });
try {
const response = await new Promise((resolve, reject) => {
const request = https.request(
url.toString(),
{
method: 'GET',
headers: { 'Authorization': `Bearer ${oauthToken}` }
},
resolve);
oncancel = error => request.abort();
request.on('error', reject);
request.end();
});
if (cancelled) throw cancelled;
// do I need "oncancel = null" here?
// or should I still allow to call request.abort() while fetching the response's data?
// oncancel = null;
try {
// read the response
const chunks = await new Promise((resolve, reject) => {
response.on('error', reject);
const chunks = [];
response.on('data', data => chunks.push(data));
response.on('end', () => resolve(chunks));
});
if (cancelled) throw cancelled;
const data = JSON.parse(chunks.join(''));
return data;
}
finally {
response.resume();
}
}
finally {
oncancel = null;
}
}