val.h

Embind C++ 类 emscripten::val(在 val.h 中定义)用于将 JavaScript 代码转录为 C++。

此类的指南材料可以在 使用 val 将 JavaScript 转录为 C++ 中找到。

class emscripten::val

此类是 C++ 数据类型,可用于表示(并提供对)任何 JavaScript 对象的便捷访问。您可以使用它来调用 JavaScript 对象、读取和写入其属性,或将其强制转换为 C++ 值,例如 boolintstd::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");
static val array()

创建并返回一个新的 Array

static val object()

创建并返回一个新的 Object

static val u8string(const char *s)

从 UTF-8 编码的字符串文字创建 val

static val u16string(const char16_t *s)

从 UTF-16 编码的字符串文字创建 val

static val undefined()

创建一个表示 undefinedval

static val null()

创建一个表示 nullval

EM_VAL 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());
static val 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>();
static val global(const char *name)

按指定的 name 查找全局值。

static val module_property(const char *name)

在 Emscripten 模块对象上按提供的 name 查找值。

explicit val(T &&value)

构造函数。

通过从任何与 Embind 兼容的 C++ 类型进行转换来创建一个 val。例如,val(true)val(std::string("foo"))

explicit val(const char *v)

从字符串文字构造 val 实例。

val(val &&v)

将值的拥有权移动到新的 val 实例。

val(const val &v)

创建对提供的 val 实例背后的相同值的另一个引用。

~val()

通过减少其引用计数来删除当前绑定的值。

val &operator=(val &&v)

删除对当前绑定的值的引用,并接管提供的引用。

val &operator=(const val &v)

删除对当前绑定的值的引用,并创建对提供的 val 实例背后的值的另一个引用。

bool hasOwnProperty(const char *key) const

检查 JavaScript 对象是否具有具有指定名称的自身(非继承)属性。

val new_(Args&&... args) const

假设当前值是构造函数,并创建该构造函数的实例。等效于 JavaScript 表达式 new currentValue(…)

val operator[](const T &key) const

获取 JavaScript 对象的指定 (key) 属性。

void set(const K &key, const val &v)

使用值 v 设置 JavaScript 对象的指定 (key) 属性(通过 val 访问)。

val operator()(Args&&... args) const

假设当前值是函数,并使用提供的参数调用它。

ReturnValue call(const char *name, Args&&... args) const

使用提供的参数在当前对象上调用指定的方法 (name)。

T as() const

将当前值转换为指定的 C++ 类型。

val typeof() const

返回在当前值上调用的 JavaScript typeof 运算符的结果。

std::vector<T> vecFromJSArray(const val &v)

将 JavaScript 数组复制到 std::vector<T> 中,通过 .as<T>() 转换每个元素。有关使用数字的更高效但更不安全的版本的示例,请参见 convertJSArrayToNumberVector

参数

val v – 要复制的 JavaScript 数组

返回值

从 JavaScript 数组创建的 std::vector<T>

std::vector<T> convertJSArrayToNumberVector(const val &v)

将 JavaScript 数组高效地转换为 std::vector<T>,就像在每个元素上使用 JavaScript Number() 函数一样。这比 vecFromJSArray 对任何具有超过 2 个值的数组都要高效得多,但不适用于非数值数组。没有执行类型检查,因此任何无效的数组条目将静默地替换为 NaN 值(或整数类型的 0)。

参数

val v – 要复制的 JavaScript(类型化)数组

返回值

从 JavaScript 数组创建的 std::vector<T>

val await() const

暂停 C++ 以 await Promise / thenable。

返回值

已完成的值。

注意

此方法需要启用 ASYNCIFY

val 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