Вызов Promise с использованием нода-addon-api выдает ошибку или не выдает - PullRequest
0 голосов
/ 13 марта 2020

Код: https://github.com/t348575/blockchain-api-testing/tree/master

Блоки добавляются с помощью genesis (). Поток наблюдает за рабочей очередью и отправляет блоки для вычисления и добавления в цепочку. Порядок должен быть сохранен, поэтому у меня есть система очередей. Об этом позаботится Queue () в AsyncWorker? Этот пример работает, если моя система очередей удалена. BlockChainWrapper содержит все функции и наследует от ObjectWrap. Когда должен выполняться элемент из очереди, используется AsyncBlockChainWrapper, который реализует PromiseWorker, который выполняет некоторую цепочку блоков и возвращает строку в block_as_json_string, после чего обещание должно быть разрешено. Запуск BlockchChainAPI.js выдает ошибку V8, в то время как test.js не дает никакого вывода вообще. Что здесь происходит? Я относительный новичок в узел-аддон-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).

1 Ответ

0 голосов
/ 16 марта 2020

Подчеркнув еще один момент в комментариях, чтобы еще больше сократить ваш пример, чтобы вы могли просто опубликовать код в вопросе и просто сохранить ссылку для воспроизведения, вот уже предварительный ответ на ваш вопрос:

Первый:

Порядок должен быть сохранен, поэтому у меня есть система очередей. Разве Queue () в AsyncWorker позаботится об этом?

Нет, NAPI не документирует какую-либо гарантию заказа, и я был бы удивлен, если бы это было так, поскольку эта "очередь" только в Средство откладывания работы, которая будет взята одним из множества рабочих потоков.

А также, если вы не используете NAPI правильно, вы должны прочитать документацию AsyncWorker и весь Shebang Lifetime, например, вы написали в 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 четко документирует, что вы не должны вызывать функции NAPI в функции execute.

...