Skip to main content

同步 vs 异步

arkffi 默认的 C 函数调用是同步的——lib.symbols.add(2.0, 3.0) 会阻塞当前线程直到函数返回。 对于耗时操作(复杂计算、I/O),可以使用 callAsync 将调用卸载到 libuv 工作线程,返回一个 Promise。

ffi.callAsync

语法

参数

AsyncCFunction

AsyncCFunctionCFunction 的异步版本,签名完全一致,但返回 Promise<number>。不需要通过 defineFunction 注册,直接使用函数指针:

对比

dlopen 配合使用

实现原理

  1. callAsync 在 JS 线程解析参数并创建 napi_async_work
  2. 工作线程上执行 DispatchCallRaw——纯 C 函数指针调用,不涉及 NAPI
  3. 完成后在 JS 线程上 resolve Promise
  4. 整个过程中 JS 主线程不被阻塞

限制

  • 不支持字符串返回类型(callString 无异步版本)
  • 回调函数(JSCallback)不能在异步工作线程中调用
  • 必须先将函数通过 defineFunction 注册