首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在V8附件中检索和存储Node.js对象

在V8附件中检索和存储Node.js对象
EN

Stack Overflow用户
提问于 2015-09-07 03:39:33
回答 1查看 1.2K关注 0票数 2

我正在尝试将一个从JavaScript传递给Node.js的对象存储在void *中。我似乎无法编译它;使用node构建生成error: no matching function for call to 'Cast'

我想要做的长篇版本是编写一个运行The的Node.js插件。从鸟瞰的角度来看,C函数的工作原理是将指向一个不透明的声音结构的指针作为(通常)第一个参数。此结构包含void *到“hostData”的任意数据集,这些数据是由承载set的程序设置的。在本例中,C声波所做的一些事情,比如发布消息,都是用回调函数指针进行修改的。我需要一个地方来存储also的每个实例的回调,所以我尝试让某人从hostData将JavaScript设置为一个对象,但我也希望在这个hostData对象上将also实例的回调设置为隐藏属性

我认为代码应该看起来像

代码语言:javascript
复制
#include "csound.h"

#include <node.h>

static void CsoundMessageCallback(CSOUND *Csound, int attributes,
  const char *format, va_list valist)
{
  // Call the JavaScript function we stored in the hostData of Csound.
}

static void _wrap_csoundSetMessageCallback(
  const v8::FunctionCallbackInfo<v8::Value>& args)
{
  v8::HandleScope scope(v8::Isolate::GetCurrent());

  CSOUND *Csound;
  // Pretend we get the Csound instance from args[0] here. This is actually done
  // by SWIG <http://www.swig.org>.

  // This does not compile. csoundGetHostData() returns a void *, but I’m assuming
  // hostData was set to an object from JavaScript.
  v8::Persistent<v8::Object> hostData =
    v8::Persistent<v8::Object>::Cast(csoundGetHostData(Csound));

  hostData.SetHiddenValue(
    v8::String::New("CsoundMessageCallback"),
    v8::Persistent<v8::Function>::Cast(args[1])
  ); 
  csoundSetMessageCallback(Csound, CsoundMessageCallback);
}

我想我需要仔细看看V8的内部字段,但我真的不确定。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-07 16:09:49

通常,在这种情况下,我编写了一个包装器C++类(从节点的ObjectWrap类继承),该类存储指向我正在包装的任何C/C++类的实例的指针,并具有与该实例交互的各种公共方法。

当从called调用new时,将创建包装器C++类的新实例,并将其与新的JS对象关联。然后有JS函数来启动任何利用包装库回调的异步任务。

从这里开始,只需从包装好的库的回调中调用uv_async_send(),发出主线程的信号,然后从uv_async回调调用JS回调。

您可以看到所有这些这里的示例(特别是在特定于Windows的部分):

  • Pcap类保存一个pcap_t指针(将是您的CSOUND指针)。
  • 当从JS创建一个新的Pcap时,i 包装一个新的C++类实例
  • uv_async_t,它将回调设置为在uv_async_send()上触发,并将关联用户数据指针。设置为类实例,以便于访问。如果您愿意,可以在调用new期间进行此初始化,而不是像我从初始化只发生一次以来所做的那样,创建一个单独的原型函数(open())。
  • 然后从包装库的回调,我信号主线程。
  • 通过uv_async回调,我可以安全地使用访问包装类实例和V8函数。虽然在我的特殊情况下,我有另一个 回调,它使用V8函数。但是,您可以在uv_async回调中安全地使用它们。

至于存储JS回调,有不同的方法来处理。一种解决方案可能是创建一个指挥棒对象,该对象存储JS回调和包装类实例的持久副本,并将其存储在uv_async_t的用户数据指针中。这意味着为每个请求创建一个新的uv_async_t (这与我前面给出的示例不同)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32430748

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档