Node.js插件编写-异步AsyncWorker的代码实现

Posted UsherYue

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Node.js插件编写-异步AsyncWorker的代码实现相关的知识,希望对你有一定的参考价值。

异步介绍

我们在Node.js中经常用到异步机制, 比如异步改变一个文件的访问权限,然后任务完成之后我们收到一个回调通知:

代码如下:

import  chmod  from 'fs';

chmod('chmod.txt', 0o775, (err) => 
  console.log('The permissions for file "my_file.txt" have been changed!');
);

原理实现

这里我们用到了一个很重要的类,Napi::AsyncWorker , 继承自这个类就拥有了异步线程的能力。

实现下面这两个函数方法,就可以实现异步任务,并且在任务中访问 JS引擎是线程安全的。

 void Execute() 
 void OnOK() 

插件代码

AsyncWork.cpp

//
// Created by usher.yue on 2021/12/31.
//
#ifndef MY_NODE_ADDON_ASYNCWORK_H
#define MY_NODE_ADDON_ASYNCWORK_H

#include <napi.h>
class AsyncWork : public Napi::AsyncWorker
    using INTVAL=int;
public:
    AsyncWork(Napi::Function& callback, int value): Napi::AsyncWorker(callback),val_(value) 
    ~AsyncWork() 

    // worker执行代码
    void Execute() 
        printf("the worker-thread doing! %d \\n",val_);
    

    //worker完成后回调
    void OnOK() 
        Callback().Call(Env().Undefined(), Napi::Number::New(Env(), 0));
    
private:
   INTVAL val_;
;

#endif //MY_NODE_ADDON_ASYNCWORK_H

main.cpp

#include <napi.h>
#include "AsyncWork.h"

// 暴露一个函数js调用
Napi::Value asyncDo(const Napi::CallbackInfo& info) 
    int value = info[0].As<Napi::Number>().Uint32Value();
    //反解析
    Napi::Function callback = info[1].As<Napi::Function>();
    AsyncWork* piWorker = new AsyncWork(callback, value);
    piWorker->Queue();
    return info.Env().Null();


//模块注册函数,用于每个自定义模块注册
Napi::Object Init(Napi::Env env, Napi::Object exports) 
    //暴露方法
    exports.Set(Napi::String::New(env,"asyncDo"),Napi::Function::New(env,asyncDo));
    return exports;


NODE_API_MODULE(addon, Init)

index.js调用

var addon = require('bindings')('my_node_addon.node');

addon.asyncDo(100,async(err,ret)=>
    console.log("done!")
    console.log('Callback err:',err);
    console.log('Callback ret:',ret);
);

输出结果

到这里简单的代码我们就完成了,Node.js异步任务插件的开发。

 

以上是关于Node.js插件编写-异步AsyncWorker的代码实现的主要内容,如果未能解决你的问题,请参考以下文章

Node.js插件编写-异步AsyncWorker的代码实现

Node.js插件编写-插件代码通过Emit与js代码进行交互

Node.js插件编写-插件代码通过Emit与js代码进行交互

Node.js插件编写-插件代码通过Emit与js代码进行交互

如何为 Node.js 编写异步函数

Node.js插件编写-通过Node-Api编写简单插件入门