我正在学习如何使用node-addon-api,现在我陷入了异步/等待管理。我无法理解如何处理本机函数接收具有异步函数的对象的情况。
Javascript:
const addon = require('bindings')('addon');
class Foo {
async doAsync() {
...
}
}
const useFoo = () => {
const foo = new Foo();
await addon.doStuff(foo);
}
母语:
#include <napi.h>
using namespace Napi;
Napi::Object doStuff(const Napi::CallbackInfo& info) {
Napi::Env env = info.Env();
MyObject* foo = Napi::ObjectWrap<MyObject>::Unwrap(info[0].As<Napi::Object>());
// How should I await for this?
foo.doAsync();
...
}
Napi::Object InitAll(Napi::Env env, Napi::Object exports) {
exports.Set(Napi::String::New(env, "doStuff"), Napi::Function::New(env, doStuff));
return exports;
}
NODE_API_MODULE(addon, InitAll)
我的问题是我找不到有关此行为的任何文档。我读了有关如何在本机中创建承诺的信息,而不是从JS收到时如何使用它的信息。
答案 0 :(得分:1)
在C ++插件方面,您必须异步实现功能并返回Promise。参见下面的链接以获取确切的示例。
在Javascript端,您必须将该async / Promise调用包装在显式异步Javascript函数中。否则,如果您尝试等待Promise,则会收到有关该函数不是异步的错误消息。因此,在您的JS端,应该执行以下操作:
async function init() {
let obj = new YourAddon()
let cnxnResult = await obj.connect()
}
init()
因此您可以创建自己的Javascript类(如您的代码示例)来包装此C ++功能并使所有内容保持异步/等待友好状态。
我发现此链接对于显示C ++附加组件侧的结构特别有用: Promise / AsyncWorker example