【发布时间】:2019-11-17 03:01:07
【问题描述】:
我正在学习如何使用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)
我的问题是我没有找到有关此行为的任何文档。我读到了如何在本机中创建一个 Promise,但没有从 JS 接收到如何使用它。
【问题讨论】:
-
你想用承诺做什么?可能你会想调用它的
then方法,没有什么别的了。 (不,我怀疑 C++ 中有await对应) -
是的,我会使用在本机代码中具有异步方法的 JS 类。我不明白这种对象应该如何包装。
-
你不会将它与返回承诺的普通方法不同。
-
C++ 20 中会出现 async/await,称为协程,可以作为很多编译器的实验特性使用。然后,围绕 Promise 创建自己的可等待包装器。
-
等待某事等同于轮询标志或使用回调 - 在主线程中意味着暂停执行 - 因此您可以将其包装在 std::thread 或类似的返回一个 deferred:: promise() - 但现在我想知道什么信息如此重要以至于它必须在本机中调用并且之前不能在 js 中等待?
标签: node.js promise async-await node-addon-api