记录AbortController的两个使用场景,多多沉淀,防止遗忘。
场景一:取消请求接口
用法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| const controller = new AbortController(); const signal = controller.signal;
function fetchVideo() { fetch(url, { signal }) .then((response) => { console.log("Download complete", response); }) .catch((err) => { console.error(`Download error: ${err.message}`); }); }
setTimeout(() => { controller.abort(); }, 1000);
|
备注
当 abort方法被调用时,fetch将会抛出一个AbortError错误。
场景二:取消事件监听
传统用法
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| const listener = () => {};
someElement.addEventListener( "mouseup", listener, );
someElement.removeEventListener( "mouseup", listener, );
|
缺陷
取消时需要传入添加监听时监听回调函数,如果添加和移除在两个不同的逻辑块,处理起来会麻烦很多。
现代用法
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| const controller = new AbortController(); const signal = controller.signal;
someElement.addEventListener( "mouseup", () => {}, { signal }, );
controller.abort();
|
总结
以上只是列举了最简单实用场景,实际使用中,一个signal可以同时赋值给多个请求/监听,大大方便了批量操作,减少了心智负担。