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 註冊