JS 中指针的用法

在JS调用很少有调用指针的地方,但是当直接调用DLL库时,需要用到相关指针。

有char* , void* ,int* struct * 函数指针,指针的指针….等。

1. char *
如下为char * 类型,没有实际的内存地址。就等价于char *.

var m_char = ref.refType('char');

如下为实际的char *地址,先申请内存,然后进行取地址操作。

var m_data = ref.alloc('char');
var m_charPtr = m_data.ref();

2. void *
如下为void* 类型,没有实际的内存地址。就等价于void*.

var m_char = ref.refType('void');

如下为实际的void *地址,先申请内存,然后进行取地址操作。

var m_data = ref.alloc('void');
var m_voidPtr = m_data.ref();

3. int *

int 指针和char 的用法一致。

4. struct *

结构体指针为对结构体的引用。

定义结构体需要先引用ref-Struct模块。

var Struct = require("ref-Struct);

先声明结构体

var m_Struct = Struct({ 'arg1':'int', 'arg2':'int' });

定义一个结构体变量,赋值

var m_StructValue = new m_Struct();
m_StructValue.arg1 = 1;
m_StructValue.arg2 = 2;

取地址

var m_StructPtr = m_StructValue.ref();

5. 函数指针
在JS 中,其实函数名就是一个函数指针。可以直接拿来用。

例如我声明一个回调函数

var dll = require("ffi");
var callBack = dll.callback('bool',['pointer','int','int'],Fun_callback);

其中Fun_callback为函数指针。
可以如下方式来实现

function Fun_callback() { console.log("this is callback!"); }

6. 指针的指针

指针的指针是一个比较绕口的东西。
可以这样理解: 指针1 指向 地址1 , 指针2 指向地址2 ,而地址2的值就是指针1。 那么指针2就是一个指针的指针,也可以称之为二维指针。

先声明一个void *指针

var m_Hand = ref.alloc('void');
var HAND= m_Hand.ref();

再取指针的地址

var ptr = HAND.ref();

以上均为个人见解,如果建议,请留言,谢谢。

转载请注明出处

<think>我们正在讨论如何使用AbortController来取消前端请求。根据引用[1]和[2],AbortController是一个Web API,用于终止一个或多个Web请求。它特别适用于fetch请求,但也可以用于其他支持AbortSignal的异步操作。 基本步骤: 1. 创建一个AbortController实例。 2. 从该实例中获取signal(信号)对象。 3. 将该signal作为fetch请求的选项(或axios等支持AbortSignal的库的选项)传递。 4. 当需要取消请求时,调用abortController.abort()方法。 在引用[3]中提到了在Vue3项目中使用AbortController取消axios请求的注意事项,包括避免重复使用控制器(每个请求使用新实例)和内存泄漏预防(在组件卸载时清理)。 下面我们将分别展示在原生fetch和axios中使用AbortController的方法。 一、在原生fetch中使用AbortController 示例代码: ```javascript // 1. 创建AbortController实例 const controller = new AbortController(); const signal = controller.signal; // 2. 发起fetch请求,传递signal fetch('https://api.example.com/data', { signal }) .then(response => response.json()) .then(data => console.log(data)) .catch(err => { // 如果请求被取消,err.name会是'AbortError' if (err.name === 'AbortError') { console.log('请求被取消'); } else { console.error('请求出错', err); } }); // 3. 在需要取消请求的时候调用abort() // 例如:用户点击取消按钮 document.getElementById('cancelButton').addEventListener('click', () => { controller.abort(); }); ``` 二、在axios中使用AbortController(从v0.22.0开始支持) 示例代码: ```javascript import axios from 'axios'; // 1. 创建AbortController实例 const controller = new AbortController(); // 2. 发起请求,传递signal axios.get('https://api.example.com/data', { signal: controller.signal }) .then(response => { console.log(response.data); }) .catch(err => { // 使用axios.isCancel判断是否是被取消的请求 if (axios.isCancel(err)) { console.log('请求被取消:', err.message); } else { console.error('请求出错', err); } }); // 3. 取消请求 // 例如:在某个事件中 controller.abort('用户取消了请求'); ``` 三、在Vue3组件中使用AbortController(结合生命周期) 在Vue3中,我们可以在setup函数中使用onBeforeUnmount钩子来在组件卸载时取消所有未完成的请求,避免内存泄漏。 示例代码: ```vue <template> <div> <button @click="fetchData">获取数据</button> <button @click="cancelRequest">取消请求</button> </div> </template> <script> import { ref } from 'vue'; export default { setup() { let abortController = ref(null); const fetchData = () => { // 每次发起新请求前,先取消之前的请求(如果需要) if (abortController.value) { abortController.value.abort(); } // 创建新的AbortController abortController.value = new AbortController(); fetch('https://api.example.com/data', { signal: abortController.value.signal }) .then(response => response.json()) .then(data => console.log(data)) .catch(err => { if (err.name === 'AbortError') { console.log('请求被取消'); } else { console.error('请求出错', err); } }); }; const cancelRequest = () => { if (abortController.value) { abortController.value.abort(); abortController.value = null; } }; // 组件卸载时取消请求 onBeforeUnmount(() => { if (abortController.value) { abortController.value.abort(); } }); return { fetchData, cancelRequest }; } }; </script> ``` 四、注意事项 1. 每次请求都应使用新的AbortController实例,因为一个AbortController一旦被取消就不能再次使用。 2. 在组件卸载时取消请求,避免在组件销毁后更新状态导致内存泄漏(参考引用[3])。 3. 浏览器兼容性:AbortController在现代浏览器中得到广泛支持,但对于旧浏览器(如IE11)需要使用polyfill(如abortcontroller-polyfill)[^3]。 五、其他应用场景 除了取消网络请求,AbortController还可以用于: - 取消WebSocket连接(通过检查signal.aborted状态) - 取消定时任务(结合setTimeout和clearTimeout) - 其他任何支持AbortSignal的异步操作 例如,取消一个定时任务: ```javascript const controller = new AbortController(); const signal = controller.signal; // 设置一个定时器,但如果信号被终止则取消 const timeoutId = setTimeout(() => { console.log('定时任务执行'); }, 5000); // 监听取消信号 signal.addEventListener('abort', () => { clearTimeout(timeoutId); }); // 在需要时取消 controller.abort(); ``` 总结:AbortController为前端提供了一种统一的方式来管理异步操作的取消,特别是在处理多次重复请求时,可以确保只展示最新的数据,避免旧数据覆盖新数据的问题[^1][^2]。 §§相关问题§§ 1. 如何在前端框架(如React)中集成AbortController? 2. 除了AbortController,还有哪些方法可以避免重复请求? 3. 如何为不支持AbortController的浏览器提供兼容?</think>### 前端使用 AbortController 的完整指南 AbortController 是现代浏览器提供的 Web API,用于主动终止异步操作(如 fetch 请求)。以下是详细使用方法: #### 一、基础使用方法 ```javascript // 1. 创建控制器和信号 const controller = new AbortController(); const { signal } = controller; // 2. 发起 fetch 请求并传递信号 fetch('https://api.example.com/data', { method: 'GET', signal // 关键:传入信号对象 }) .then(response => response.json()) .then(data => console.log('请求成功:', data)) .catch(err => { // 3. 区分取消错误和其他错误 if (err.name === 'AbortError') { console.log('请求已取消'); } else { console.error('请求失败:', err); } }); // 4. 取消请求(可在任意位置调用) document.getElementById('cancelBtn').addEventListener('click', () => { controller.abort(); // 触发取消操作 }); ``` #### 二、在 Axios 中的使用 ```javascript // 创建控制器 const controller = new AbortController(); axios.get('/api/data', { signal: controller.signal // 传递信号 }) .then(response => console.log(response.data)) .catch(err => { if (axios.isCancel(err)) { console.log('请求取消:', err.message); } }); // 取消请求 controller.abort('用户主动取消'); ``` #### 三、在 Vue3 组件中的实现 ```vue <script setup> import { ref, onBeforeUnmount } from 'vue'; const abortController = ref(null); async function fetchData() { // 取消前一个未完成的请求 if (abortController.value) { abortController.value.abort(); } // 创建新控制器 abortController.value = new AbortController(); try { const response = await fetch('/api/data', { signal: abortController.value.signal }); // 处理数据... } catch (err) { if (err.name !== 'AbortError') console.error(err); } } // 组件卸载时自动取消请求 onBeforeUnmount(() => { abortController.value?.abort(); }); </script> ``` #### 四、核心特性解析 1. **信号机制** `controller.signal` 是只读属性,用于传递取消状态: ```javascript console.log(signal.aborted); // 检测是否已取消 signal.addEventListener('abort', () => { console.log('取消事件触发'); }); ``` 2. **多请求控制** 一个控制器可取消多个关联请求: ```javascript const controller = new AbortController(); fetch('/api/user', { signal: controller.signal }); fetch('/api/posts', { signal: controller.signal }); // 同时取消两个请求 controller.abort(); ``` 3. **超时自动取消** 实现请求超时自动终止: ```javascript const controller = new AbortController(); // 设置5秒超时 setTimeout(() => controller.abort(), 5000); fetch('/api/slow', { signal: controller.signal }); ``` #### 五、最佳实践 1. **请求复用** 每个请求必须使用**新的控制器实例**(已取消的控制器不可重用)[^3]: ```javascript // 错误做法 ❌ const controller = new AbortController(); fetch('/api/1', { signal: controller.signal }); controller.abort(); fetch('/api/2', { signal: controller.signal }); // 失效! // 正确做法 ✅ function newRequest() { const controller = new AbortController(); fetch('/api/data', { signal: controller.signal }); return controller; } ``` 2. **框架整合** React 示例(使用 useEffect 清理): ```jsx function DataComponent() { useEffect(() => { const controller = new AbortController(); fetch('/api/data', { signal: controller.signal }) .then(/* ... */); return () => controller.abort(); // 清理函数 }, []); } ``` 3. **浏览器兼容方案** 支持旧版浏览器(如 IE11): ```bash npm install abortcontroller-polyfill ``` ```javascript import 'abortcontroller-polyfill/dist/abortcontroller-polyfill-only'; ``` #### 六、应用场景 1. **用户中断操作** - 取消页面跳转前的未完成请求 - 关闭弹窗时终止相关请求 2. **竞态条件处理** 确保只展示最新请求结果: ```javascript let latestController = null; async function search(query) { latestController?.abort(); const controller = new AbortController(); latestController = controller; const results = await fetch(`/search?q=${query}`, { signal: controller.signal }); // 显示结果... } ``` 3. **性能优化** 取消离开页面后的后台请求,节省带宽和计算资源[^1][^2]。 > **关键提示**:被取消的请求在 Chrome DevTools 的 Network 标签中会显示 `(canceled)` 状态,在 Firefox 中显示 `AbortError`[^1]。 --- ### 相关问题 1. 如何检测浏览器对 AbortController 的支持情况? 2. 在 React 类组件中如何正确实现请求取消? 3. AbortController 能否用于取消 WebSocket 连接? 4. 如何封装通用的请求取消工具函数? 5. 被取消的请求在服务器端会发生什么?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值