侧边栏壁纸
  • 累计撰写 218 篇文章
  • 累计创建 59 个标签
  • 累计收到 5 条评论

NAPI 笔记 08:函数和函数引用

barwe
2022-08-30 / 0 评论 / 0 点赞 / 1,769 阅读 / 1,883 字
温馨提示:
本文最后更新于 2023-06-07,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

class Function

Function 类可以将在 C++ 中创建的函数对象暴露给 JavaScript,从而在 JavaScript 中执行。

通过该类创建的函数并不会自动暴露给 JavaScript,还是需要通过 exports 对象导出。

对于来自非 JavaScript 线程、需要使用同步事件循环调用的回调函数,请使用 ThreadSafeFunction 类。

Function 对象绑定的函数按照有无返回值可以分为两类:

using VoidCallback = void (*)(const CallbackInfo& info);
using Callback = Value (*)(const CallbackInfo& info);

New

template <VoidCallback cb> static Function::New(env, utf8name, data);
template <Callback cb> static Function::New(env, utf8name, data);
template <typename Callable> static Function::New(env, Callable cb, utf8name, data);
//...

Call & MakeCallback

Function 类还可以用来执行从 JavaScript 中传递过来的函数。

Function 有两个实例方法可以做这个事情:Call & MakeCallback

Call 用于执行存在于 JavaScript 调用栈中的函数,MakeCallback 用于调用不存在于 JavaScript 调用栈中的函数。

Value Function::Call(const std::initializer_list<napi_value>& args) const;
Value Function::Call(const std::vector<napi_value>& args) const;
Value Function::Call(size_t argc, const napi_value* args) const;
Value Function::Call(napi_value recv, const std::initializer_list<napi_value>& args) const;
Value Function::Call(napi_value recv, const std::vector<napi_value>& args) const;
Value Function::Call(napi_value recv, size_t argc, const napi_value* args) const;

Value Function::MakeCallback(napi_value recv, const std::initializer_list<napi_value>& args, napi_async_context context = nullptr) const;
Value Function::MakeCallback(napi_value recv, const std::vector<napi_value>& args, napi_async_context context = nullptr) const;
Value Function::MakeCallback(napi_value recv, size_t argc, const napi_value* args, napi_async_context context = nullptr) const;

class FunctionReference

FunctionReference ;类继承自 Reference 类,等价于Reference<Function>

每个 FunctionReference 实例持有 Function 对象的引用,并维护其引用计数。

  • FunctionReference Weak(const Function& f) 弱引用,引用计数被设置为 0
  • FunctionReference Persistent(const Function& f) 持久引用,即强引用,引用计数被设置为 1

因为 FunctionReference 实例直接与 Function 实例绑定,所以也可以在 FunctionReference 实例上调用Call或者MakeCallback方法来调用函数。

0

评论区