[英]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.