node.js - 本机模块中的异步等待
问题描述
我正在学习如何使用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 接收到如何使用它。
解决方案
在 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 示例
推荐阅读
- javascript - 开发服务器在 React Native 中返回响应错误代码:500
- php - 本地主机上的 Laravel 5.4:QueryException 找不到驱动程序(SQL:select * from `sessions`
- c# - 从另一个页面导航回来后,UWP 无法在文本框中设置文本
- ballerina - 访问 Ballerina 中 SQL 选择查询返回的数据
- android - 在 React 本机项目中更新 android gradle 插件和 gradle
- instagram - 以编程方式在 Instagram 上发布和标记媒体
- python - 使用付费 Google API(Google 自定义搜索 API)获取给定查询的 Google 结果数的 Python 代码是什么。
- css - 在 AngularJS 的 ng-repeat 中,div 的大小设置为 386x104
- c - ARM Cortex-M 内存访问
- python-3.x - 使用类似模块的pyc缓存的Python3 execfile?