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 物件(透過 val 存取)的指定 (key) 屬性。

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() 函式。在任何具有超過 2 個值的陣列上,這比 vecFromJSArray 更有效率,但不適合用於非數值的陣列。不會進行任何類型檢查,因此任何無效的陣列項目都會以 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 Promise。

它與任何 C++20 協程相容,但通常應在也將成為 Promise 的傳回 val 的協程內使用。

例如,它允許您將此 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