【发布时间】:2019-10-25 18:19:27
【问题描述】:
我需要在 Node.js 中实现一个可取消的客户端 HTTP 请求,而不使用外部库。我给出了一个 Promise 对象 - cancellationPromise - 当外部请求取消时它会被拒绝。这就是我知道我可能需要致电request.abort() 的方式。
问题是,只有当https.request 仍处于待处理状态且response 对象尚不可用时,我是否应该调用request.abort()?
或者,即使我已经得到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;
}
}
【问题讨论】:
-
您应该只在得到响应之前中止请求。收到响应后,您应该根据响应来决定是要中止请求还是要成功响应,而不是立即中止请求。
-
@AkanshGulati,如果
cancellationPromise在我得到响应对象后被拒绝但我仍在接收它的数据块怎么办?
标签: javascript node.js httprequest cancellation