作者:mobiledu2502860057 | 来源:互联网 | 2022-10-21 13:12
我需要在Node.js中实现可取消的客户端HTTP请求,而不使用外部库。我给一个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;
}
}
Hash..
6
这取决于您要中止请求来实现的目标。
只是一点背景。HTTP 1无法“取消”它发送的请求,然后等待响应。您无法“回滚”您所做的请求。您需要进行分布式事务。(进一步阅读。)如MDN开发人员文档所述:
如果请求已经发送,则XMLHttpRequest.abort()方法将中止该请求。当请求中止时,其readyState更改为XMLHttpRequest.UNSENT(0),并且请求的状态码设置为0。
基本上,您可以停止响应被应用程序处理。另一个应用程序可能会(如果您abort()
在发送给它之后调用了它)仍然完成其处理。
从问题的角度来看:
问题是,request.abort()
仅在https.request
仍处于挂起状态且响应对象尚不可用时,才应该调用吗?
TL.DR .:仅从您的应用程序角度来看很重要。当我浏览您的代码时,我认为它会很好地工作。
1> Hash..:
这取决于您要中止请求来实现的目标。
只是一点背景。HTTP 1无法“取消”它发送的请求,然后等待响应。您无法“回滚”您所做的请求。您需要进行分布式事务。(进一步阅读。)如MDN开发人员文档所述:
如果请求已经发送,则XMLHttpRequest.abort()方法将中止该请求。当请求中止时,其readyState更改为XMLHttpRequest.UNSENT(0),并且请求的状态码设置为0。
基本上,您可以停止响应被应用程序处理。另一个应用程序可能会(如果您abort()
在发送给它之后调用了它)仍然完成其处理。
从问题的角度来看:
问题是,request.abort()
仅在https.request
仍处于挂起状态且响应对象尚不可用时,才应该调用吗?
TL.DR .:仅从您的应用程序角度来看很重要。当我浏览您的代码时,我认为它会很好地工作。
可以中止HTTP GET或HEAD,但不能中止POST或PUT。一旦呼叫者确实决定中止,他们很可能不希望呼叫任何钩子并承诺被拒绝,因此我想说总是中止。