簡體   English   中英

使用 node-addon-api 的 Promise 調用拋出錯誤或不提供任何輸出

[英]Promise invocation using node-addon-api throws error or gives no output

代碼: 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 類)。

在進一步強調評論中的這一點的同時,為了進一步減少您的示例,以便您能夠僅在問題中發布代碼並保留用於復制的鏈接,這里已經是您問題的初步答案:

第一的:

需要保留訂單,這就是為什么我有一個排隊系統。 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 清楚地記錄了你不能在execute函數中調用 NAPI 函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM