0

代码:https ://github.com/t348575/blockchain-api-testing/tree/master

使用 genesis() 添加块。一个线程监视工作队列,并发送要计算的块并将其添加到链中。需要保留订单,这就是我有排队系统的原因。AsyncWorker 中的 Queue() 会处理这个问题吗?如果我的排队系统被删除,这个例子就可以工作。BlockChainWrapper拥有所有功能,并继承自ObjectWrap. 当要执行队列中的一个项目时,AsyncBlockChainWrapper使用 ,它实现PromiseWorker了 ,它执行一些块链工作并返回一个字符串到block_as_json_string,在此之后需要解决承诺。运行BlockchChainAPI.js会引发 V8 错误,而test.js根本没有输出。到底是怎么回事?我是 node-addon-api 的相对论新手。关于如何进行的任何建议?

存储 Napi::Env 和对象供以后使用(blockchainWrapper.cpp)

Napi::Value BlockChainWrapper::genesis(const Napi::CallbackInfo& info) {
    Napi::Object input_obj = info[0].As<Napi::Object>();
    std::lock_guard<std::mutex> guard_ready_queue(ready_queue_mutex);
    this->ready_queue_data.push_back(input_obj);
    this->ready_queue_func.push_back(BlockChainWrapperTypes::_genesis_ready);
    this->ready_queue_env.push_back(info.Env());
    Napi::Promise::Deferred deferred = Napi::Promise::Deferred::New(info.Env());
    return deferred.Promise();
}

向量(blockchainWrapper.h):

std::vector<Napi::Env> ready_queue_env;
std::vector<Napi::Object> ready_queue_data;

每 200 毫秒扫描一次工作队列,并调用 AsyncFunctions(AsyncWorker 类)。

4

1 回答 1

0

在进一步强调评论中的这一点的同时,为了进一步减少您的示例,以便您能够在问题中发布代码并保留复制链接,这里已经是您问题的初步答案:

第一的:

需要保留订单,这就是我有排队系统的原因。AsyncWorker 中的 Queue() 会处理这个问题吗?

不,NAPI没有记录任何订单保证,如果它会,我会感到惊讶,因为这个“队列”只是推迟工作的意思,被许多工作线程之一占用。

而且你没有正确使用 NAPI,你应该阅读 AsyncWorker 和整个 Lifetime shebang 的文档,例如你在https://github.com/t348575/blockchain-api-testing/blob/master/cpp/asyncFunctions中写的.h#L11

class AsyncFunctions : public PromiseWorker {
    public:
        AsyncFunctions(Napi::Promise::Deferred const &d, Napi::Object& resource) : PromiseWorker(d), resource(resource) {};
        virtual ~AsyncFunctions() {};
        void Execute() {
            std::this_thread::sleep_for(std::chrono::seconds(3));
            std::string input = resource.Get('data').As<Napi::String>();
            this->result = "result is: " + input;
        }

std::string input = resource.Get('data').As<Napi::String>是严格禁止的,并且会导致未定义的行为,因为 NAPI 清楚地记录了您不得在函数中调用 NAPIexecute函数。

于 2020-03-16T11:34:54.580 回答