首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >从C++代码调用JavaScript回调函数抛出错误- nbind

从C++代码调用JavaScript回调函数抛出错误- nbind
EN

Stack Overflow用户
提问于 2018-06-15 01:19:47
回答 1查看 1K关注 0票数 1

我正在尝试注册一个稍后将从C++类调用的JavaScript回调函数。我正在使用nbind制作一个node.js插件。这是我为一些更复杂的代码编写的示例代码,这些代码需要完成相同的任务:

c++代码(testing.cc):

代码语言:javascript
复制
#include "nbind/api.h"
#include <string>
#include <iostream>

class Test
{
    nbind::cbFunction *callback;

public:
    Test() {}

    //this dummy var is only here so that doCallback() will be recognized as a function
    void doCallback(int dummyVar)
    {
        std::cout << "Calling Javascript callback" << std::endl;
        //call javascript code
        if (callback != nullptr)
        {
            (*callback)("Hi there!\n");
        }

        return;
    }

    void enrollCallback(nbind::cbFunction &cb)
    {
        callback = &cb;
        return;
    }

};

#include "nbind/nbind.h"

NBIND_CLASS(Test) {
    construct<>();
    method(doCallback);
    method(enrollCallback);
    method(unenrollCallback);
}

JavaScript代码(test.js):

代码语言:javascript
复制
var nbind = require('nbind');

function printMessage(message) {
    console.log(message);
}

var lib = nbind.init().lib;

var test = lib.Test();

test.enrollCallback(printMessage);

try{
    test.doCallback(11);
} catch(err) {
    console.log(err);
}

当我在命令行中运行上面的代码时,根本得不到任何输出。当我像这样运行代码:node inspect test.js并输入continue命令时,在调用回调函数时得到以下错误:

代码语言:javascript
复制
Error: read ECONNRESET
    at _errnoException (util.js:992:11)
    at TCP.onread (net.js:618:25)

当我单步执行我的程序时,我在控制台中得到以下错误:

代码语言:javascript
复制
TypeError: test.doCallback is not a function
     at Object.<anonymous> (C:\Users\mrcole\Desktop\testy\test.js:22:10)
     at Module._compile (module.js:649:14)
     at Object.Module._extensions..js (module.js:663:10)
     at Module.load (module.js:565:32)
     at tryModuleLoad (module.js:505:12)
     at Function.Module._load (module.js:497:3)
     at Function.Module.runMain (module.js:693:10)
     at startup (bootstrap_node.js:191:16)
     at bootstrap_node.js:612:3

我哪里出错了,为什么节点的行为不一致?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-19 04:45:25

为了回答我自己的问题,不要使用nbind以这种方式调用节点JavaScript回调函数。这是一个异步调用(如果我错了,请纠正我),从2018年6月开始,nbind不支持异步回调。

一个不错的替代方案是实现其中的一个AsyncWorker classes provided by NAN

下面是一些示例代码:

代码语言:javascript
复制
class MyAsyncWorker : public Nan::AsyncProgressWorkerBase<T>
{
  public:

    MyAsyncWorker(Nan::Callback *callback_, const char *resource_name = "My Async Worker") 
    : AsyncProgressWorkerBase(callback_, resource_name)
    {
    }

    ~MyAsyncWorker()
    {
    }

    //Do work, or process notifications here
    void Execute(const ExecutionProgress &progress)
    {
        //do work. when you have something to report, 
        //call ExecutionProgress::Send( T * data, size_t count) to eventually call
        //the HandleProgressCallback function.
    }

    //Call JavaScript callback from this function
    void HandleProgressCallback(T *data, size_t count) 
    {
        Nan::HandleScope scope;

        v8::Local<v8::Value> argv[] = {
            //initialize your data to passback to callback here
        };
        callback->Call(count,argv,async_resource);
    }

    //This is called when you are done executing
    virtual void HandleOKCallback() 
    {
        Nan::HandleScope scope;

        v8::Local<v8::Value> argv[] = {
            //Prepare final values to be returned
        };
        callback->Call(1,argv,async_resource);
    }
};
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50862829

复制
相关文章

相似问题

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