1

我正在学习如何使用node-addon-api,现在我被困在 async/await 管理上。我无法理解如何处理本机函数接收具有异步函数的对象的情况。

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)

我的问题是我没有找到有关此行为的任何文档。我读到了如何在本机中创建一个 Promise,但没有从 JS 接收到如何使用它。

4

1 回答 1

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 示例

于 2020-02-25T21:47:32.973 回答