Ber*_*ues 2 javascript xmlhttprequest fetch
我需要更改定义哪些数据应来自我的请求的参数,该应用程序也需要定期刷新。如果用户在未完成的请求中更改参数,事情就会开始变得奇怪,并且会发生一些意外的行为。
所以我的方法是在开始新请求之前中止所有先前的请求,但使用后await controller.abort()似乎永远不会触发下一个请求,我是否需要清除信号或类似的东西?
const controller = new AbortController();
const async fetchData = (url, body = null) => {
let data;
const signal = controller.signal;
const headers = { ... };
response = await fetch(url, body ? {
method: "POST",
body: JSON.stringify(body),
signal,
headers
} : { headers, signal });;
data = await response.json()
return data
}
const firstData = await fetchData(url1, body1);
await controller.abort();
const secondData= await fetchData(url2, body2);
Run Code Online (Sandbox Code Playgroud)
发生的情况总是如此secondData,undefined实际上第二个请求从未发生(查看网络流量)。如果我停止源代码并尝试在执行await fetchData(url2)后运行,它会提示一个错误,或者如果我尝试在没有返回待处理承诺的情况下运行它,但在流量选项卡中看不到实际的请求。.abort()Uncaught SyntaxError: await is only valid in async functionawait
应用 ansewr 上的建议,我在函数上创建了包装器,以便每次调用新的控制器。
let controller = null;
let fetchData = null;
const initializeFetchData = () => {
const controller = new AbortController();
const async fetchData = (url, body = null) => {
let data;
const signal = controller.signal;
const headers = { ... };
response = await fetch(url, body ? {
method: "POST",
body: JSON.stringify(body),
signal,
headers
} : { headers, signal });;
data = await response.json()
return data
}
}
initializeFetchData();
const firstData = await fetchData(url1, body1);
controller.abort();
initializeFetchData();
const secondData= await fetchData(url2, body2);
Run Code Online (Sandbox Code Playgroud)
小智 5
您对两个不同的请求使用相同的方法AbortController。.abort()调用后,AbortController您已经更新了它的状态,AbortSignal然后使第二个请求无效。
AbortController如果您想要这种行为,您应该为每个请求使用单独的。当然,如果您希望能够一次性中止所有请求,那么AbortController对多个请求重复使用 an 是完全可以接受的。fetch
其他几点...
.abort()是一个返回的同步方法,因此调用时void不需要前缀。await.abort()fetch请求,该请求将在.abort()调用之前完成。| 归档时间: |
|
| 查看次数: |
2361 次 |
| 最近记录: |