Node.js插件编写(7)-异步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异步任务插件的开发。

扫描二维码关注公众号,回复: 14990606 查看本文章

猜你喜欢

转载自blog.csdn.net/yue7603835/article/details/122306596