Emscripten在C ++中等待运算符返回未定义而不是字符串值

问题描述

我的main.cpp中具有此功能 IsBrave ”。
如果浏览器包含navigator.brave,它将在等待时调用navigator.brave.isBrave()函数

但是从浏览器控制台调用导出功能时,它会在Brave浏览器上打印 undefined 值,而不是“ Brave” 。在其他浏览器中,结果为“未知”

在“勇敢的浏览器”控制台中进行了测试

> var x = await navigator.brave.isBrave(); console.log(x);
true

>var y = Main.Module.IsBrave(); console.log(y);
undefined
It's Brave.

所需的输出

> var x = await navigator.brave.isBrave(); console.log(x);
true

>var y = Main.Module.IsBrave(); console.log(y);
It's Brave.
true

我已经在返回val(u8“ Brave”)之前打印了一些东西,没问题。但是在浏览器的控制台中会获得 undefined 值。

欢迎任何帮助。谢谢。


int main()
{
}

emscripten::val IsBrave()
{
    using namespace emscripten;
    bool isBrave = !!val::global()[u8"navigator"][u8"brave"] && !!(val::global()[u8"navigator"][u8"brave"].call<val>(u8"isBrave").await());
    if(isBrave)
    {
        std::cout<< "It's Brave." << std::endl; // PRINTED OK
        return val(u8"Brave"); // GET undefined in broWSER
    }
    else
    {
        return val(u8"UnkNown");
    }
}

EMSCRIPTEN_BINDINGS(exports)
{
    using namespace emscripten;
    function<val>(u8"IsBrave",&IsBrave);
}

编译为

em++.bat `
main.cpp `
-I ../CppInclude `
-I Include `
-o Module.js `
-std=c++17 `
--bind `
-s WASM=1 `
-s disABLE_EXCEPTION_CATCHING=0 `
-s SINGLE_FILE=0 `
-s ASYNCIFY=1 `
-s VERBOSE=0 `
-O2 `
--profiling `
-s EXPORT_NAME=`'CreateModuleInstance`' `
-s MODULARIZE=1 `
-s EXPORTED_FUNCTIONS=[`'_main`'] `
-s EXTRA_EXPORTED_RUNTIME_METHODS=[`'ccall`',`'cwrap`',`'lengthBytesUTF8`',`'stringToUTF8`'] `
--pre-js "Js/Pre_Compiled.js" `
--post-js "Js/Post_Compiled.js" `
--extern-post-js "Js/ExternPost_Compiled.js" `
--extern-pre-js "Js/ExternPre_Compiled.js" `

解决方法

解决了此示例EmbindAsync