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() 函式。在任何具有超過 2 個值的陣列上,這比 vecFromJSArray
更有效率,但不適合用於非數值的陣列。不會進行任何類型檢查,因此任何無效的陣列項目都會以 NaN 值(或整數類型的 0)靜默取代。
val v – 要複製的 JavaScript (類型化) 陣列
從 JavaScript 陣列建立的 std::vector<T>
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
。