Embind C++ 类 emscripten::val
(在 val.h 中定义)用于将 JavaScript 代码转录为 C++。
此类的指南材料可以在 使用 val 将 JavaScript 转录为 C++ 中找到。
emscripten::
val
¶此类是 C++ 数据类型,可用于表示(并提供对)任何 JavaScript 对象的便捷访问。您可以使用它来调用 JavaScript 对象、读取和写入其属性,或将其强制转换为 C++ 值,例如 bool
、int
或 std::string
。
例如,以下代码显示了一些简单的 JavaScript 代码,用于对 URL 发出 XHR 请求
var xhr = new XMLHttpRequest;
xhr.open("GET", "http://url");
可以使用 C++ 编写相同的代码,使用 global()
获取全局 XMLHttpRequest
对象的符号,然后使用它来打开 URL。
val xhr = val::global("XMLHttpRequest").new_();
xhr.call<void>("open", std::string("GET"), std::string("http://url"));
可以使用 operator[]()
读取对象属性,然后使用 as()
强制转换类型,来测试 open
方法调用是否成功
const char* state;
switch (xhr["readyState"].as<int>()) {
case 0:
state = "UNSENT"; break;
case 1:
state = "OPENED"; break;
default:
state = "etc";
}
有关其他示例,请参见 使用 val 将 JavaScript 转录为 C++。
警告
JavaScript 值无法跨线程共享,因此绑定它们的 val
实例也不能共享。
例如,如果你想将某个 JavaScript 全局变量缓存为 val
,则需要在每个线程中通过其名称检索和绑定该全局变量的单独实例。最简单的方法是使用 thread_local
声明
thread_local const val Uint8Array = val::global("Uint8Array");
as_handle
() const¶返回一个表示此 val
的原始句柄。这可用于将原始值句柄传递给 JavaScript 并通过 Emval.toValue
函数在另一端检索这些值。示例
EM_JS(void, log_value, (EM_VAL val_handle), {
var value = Emval.toValue(val_handle);
console.log(value); // 42
});
val foo(42);
log_value(foo.as_handle());
take_ownership
(EM_VAL e)¶从原始句柄创建 val
。这可用于从 JavaScript 检索值,其中 JavaScript 侧应使用 Emval.toHandle
包装值,将其传递给 C++,然后 C++ 可以使用 take_ownership
将其转换为 val
实例。示例
EM_ASYNC_JS(EM_VAL, fetch_json_from_url, (const char *url), {
var url = UTF8ToString(url);
var response = await fetch(url);
var json = await response.json();
return Emval.toHandle(json);
});
val obj = val::take_ownership(fetch_json_from_url("https://httpbin.org/json"));
std::string author = obj["slideshow"]["author"].as<std::string>();
val
(T &&value)¶构造函数。
通过从任何与 Embind 兼容的 C++ 类型进行转换来创建一个 val
。例如,val(true)
或 val(std::string("foo"))
。
val
(const char *v)¶从字符串文字构造 val
实例。
~val
()¶通过减少其引用计数来删除当前绑定的值。
hasOwnProperty
(const char *key) const¶检查 JavaScript 对象是否具有具有指定名称的自身(非继承)属性。
call
(const char *name, Args&&... args) const¶使用提供的参数在当前对象上调用指定的方法 (name
)。
as
() const¶将当前值转换为指定的 C++ 类型。
vecFromJSArray
(const val &v)¶将 JavaScript 数组复制到 std::vector<T>
中,通过 .as<T>()
转换每个元素。有关使用数字的更高效但更不安全的版本的示例,请参见 convertJSArrayToNumberVector
。
val v – 要复制的 JavaScript 数组
从 JavaScript 数组创建的 std::vector<T>
convertJSArrayToNumberVector
(const val &v)¶将 JavaScript 数组高效地转换为 std::vector<T>
,就像在每个元素上使用 JavaScript Number() 函数一样。这比 vecFromJSArray
对任何具有超过 2 个值的数组都要高效得多,但不适用于非数值数组。没有执行类型检查,因此任何无效的数组条目将静默地替换为 NaN 值(或整数类型的 0)。
val v – 要复制的 JavaScript(类型化)数组
从 JavaScript 数组创建的 std::vector<T>
operator co_await
() const¶co_await
运算符允许等待由 val
表示的 JavaScript promises。
它与任何 C++20 协程兼容,但通常应在返回 val
的协程内使用,该协程也将成为 Promise
。
例如,它允许你实现等效于此 JavaScript async
/await
函数
async function foo() { const response = await fetch("http://url"); const json = await response.json(); return json; } export { foo };作为 C++ 协程
val foo() { val response = co_await val::global("fetch")(std::string("http://url")); val json = co_await response.call<val>("json"); return json; } EMSCRIPTEN_BINDINGS(module) { function("foo", &foo); }
与 await()
方法不同,它不需要 Asyncify,因为它使用本机 C++ 协程转换。
一个表示此 promise 的已完成值的 val
。