【发布时间】:2021-06-05 09:56:26
【问题描述】:
我正在尝试使用新的 JSI 绑定为 react-native 创建一个 SQLite 库/适配器。 JSI 绑定只是 Javascript Core(还有 hermes 和 V8?)之上的一层,它允许直接从 javascript 调用 c++。
对于我的问题而言,有很多代码不是很重要,但基本上,同步调用工作正常,但现在我正在尝试创建一个线程来执行异步工作,然后解决一个 javascript 承诺。
在下面的代码中,我创建并返回了一个 Promise,然后尝试生成一个线程来执行后台工作。
auto asyncExecSQL = jsi::Function::createFromHostFunction(
rt,
jsi::PropNameID::forAscii(rt, "sequel_asyncExecSQL"),
1,
[](jsi::Runtime &rt, const jsi::Value &thisValue, const jsi::Value *args, size_t count) -> jsi::Value {
jsi::Value promise = rt.global().getPropertyAsFunction(rt, "Promise").callAsConstructor(
rt,
jsi::Function::createFromHostFunction(
rt,
jsi::PropNameID::forAscii(rt, "executor"),
2,
[](jsi::Runtime &rt, const jsi::Value &thisValue, const jsi::Value *args, size_t) -> jsi::Value {
jsi::Function cb = args[0].asObject(rt).asFunction(rt);
auto resolve = std::make_shared<jsi::Function>(std::move(cb));
thread t1([rt, resolve] { // ERROR: By-copy capture of value of abstract type 'jsi::Runtime'
resolve->call(rt, jsi::Value(42));
});
return {};
}));
return promise;
});
rt.global().setProperty(rt, "sequel_asyncExecSQL", move(asyncExecSQL));
你可以或多或少地忽略所有的 jsi:: mumbo-jumbo,它更少地从 c++ 端操作 javascript 对象。可以看到Runtime对象很重要,需要它来操作和创建对象。
问题是,我正在尝试创建一个线程来在后台执行获取代码,我不知道将rt(运行时)对象移动/共享到线程中的语义。
谁能向我解释我做错了什么?
【问题讨论】:
标签: javascript c++ ios multithreading