如何解决Node NAPI Aync Workers 没有收到正确的字符串
我目前正在尝试使用具有 2 个参数的函数构建本机模块:一个字符串和一个回调。当我一次只运行一个异步工作者时,这很有效,但是当我必须同时启动 200 时,字符串参数没有正确传递。 nodejs代码:
const bindingPath = require.resolve(`./build/Release/myBinding`);
const binding = require(bindingPath);
function init(config){
return new Promise((resolve,reject) => {
binding.init(config,(err,response) => {
if(err) reject(err);
else resolve(response);
})
})
}
async function main(){
// .... some code ....
console.log(await init("this works"))
var responses = [];
var promises = [];
for(var i = 0; i < 100; i++){
promises.push(init("this won't work").then((response)=>{
responses.push(response)
}))
}
await Promise.all(promises);
console.log(responses)
}
main();
cpp 代码:
class InitWorker : public Napi::AsyncWorker {
public:
InitWorker(Napi::Function& callback,const char* config)
: Napi::AsyncWorker(callback),config(config),response("")
{
}
~InitWorker() {}
protected:
void Execute() override {
response = (char*) config;
}
void OnError(const Napi::Error& e) override
{
Napi::Env env = Env();
Callback().MakeCallback(
Receiver().Value(),{
e.Value(),env.Undefined()
}
);
}
void OnOK() override {
Callback().Call({Env().Null(),Napi::String::New(Env(),response)});
}
private:
char* response;
const char* config;
};
Napi::Value initFunc(const Napi::CallbackInfo& info) {
Napi::Env env = info.Env();
if (info.Length() < 2) {
Napi::TypeError::New(env,"Wrong number of arguments")
.ThrowAsJavaScriptException();
return env.Null();
}
if (!info[0].Isstring()) {
Napi::TypeError::New(env,"invalid config argument")
.ThrowAsJavaScriptException();
return env.Null();
}
if (!info[1].IsFunction()) {
Napi::TypeError::New(env,"invalid callback function")
.ThrowAsJavaScriptException();
return env.Null();
}
std::string str = info[0].ToString().Utf8Value();
const char* config = str.c_str();
Napi::Function cb = info[1].As<Napi::Function>();
InitWorker* initWorker = new InitWorker(cb,config);
initWorker->Queue();
return info.Env().Undefined();
}
this works
[
'\u0001�\u0001\u0002�\u0001\r\\\u000f\u001c\n�\u0001\r\u001b\u000f\u001c\u000b�\u0001\u0002�\u0002\r\\\r',"this won't work",'0�\u001d6�\u0001',"�'6�\u0001",...
]
如您所见,许多字符串无法正确传递。我怀疑是怎么回事 info[0].ToString().Utf8Value() 被异步调用。
非常感谢!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。