异步在本机模块中等待

时间:2019-07-07 08:49:37

标签: node.js promise async-await node-addon-api

我正在学习如何使用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收到时如何使用它的信息。

1 个答案:

答案 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