Open haoqi0818 opened 2 weeks ago
看了一下,有很多类似执行取消或者监听取消的诉求
通过AbortController可以比较友好的实现,像自定义的Promise也可以通过它的事件方式实现中止
const controller = new AbortController();
const signal = controller.signal;
new Promise((resolve, reject) => {
setTimeout(resolve, 3000);
signal.addEventListener("abort", () => {
console.log("Request aborted");
reject();
});
});
controller.abort();
如果要解决这个问题,是不是直接在 onBefore 里支持取消 promise 的执行就好了,比如 onBefore 里如果返回的是 false,onRequest 就不执行了。
如果要解决这个问题,是不是直接在 onBefore 里支持取消 promise 的执行就好了,比如 onBefore 里如果返回的是 false,onRequest 就不执行了。
onBefore是service还没有开始执行的时候吧,我的场景是service已经开始执行,但还没结束(fetch请求已发出没收到响应)
合理,整,不过我看 fetch 的 signal,兼容性没那么好,到时候可能需要注意一下。
目前useRequest的做法,是通过标记在竞态问题出现时,标记忽略之前请求回调(onSuccess)执行。 新加的cancel方法可以主动标记,让service执行结束后的回调(onSuccess)不再执行。
但是,这些对于并不能终止service内部的执行。
使用AbortController可以实现fetch的提前中止
自己实现过于繁琐,看看能否直接在useReuqest的时候,默认生成一个controller,传递给service方法,并且在合适时机自动调用abort方法(竞态时、cancel时)。
虽然说覆水难受,已发出去的请求服务器仍然会收到,但仍然一定以上能过做到性能提升
862
2039
https://github.com/alibaba/hooks/issues/1715#issuecomment-1166513696 目前AbortController应该不再属于实验性质了