Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Emscripten-embind导出的函数不能从Javascript同步运行。使用Asyncify_Javascript_C++_Webassembly_Emscripten - Fatal编程技术网

Emscripten-embind导出的函数不能从Javascript同步运行。使用Asyncify

Emscripten-embind导出的函数不能从Javascript同步运行。使用Asyncify,javascript,c++,webassembly,emscripten,Javascript,C++,Webassembly,Emscripten,我需要向服务器发出HTTP请求,结果是JSON。该结果用于另一个C++函数,该函数使用EbBand导出。p> 当从js调用此导出函数时,它运行速度很快,无法存储导出函数的值,值为空,稍后2秒后函数完成,但从未分配值 复制步骤 1。我的测试/伪造webapi 2。Mi JS代码-Instance.JS window.VModule({ noInitialRun: false }).then(module => { window.VMain = { Modul

我需要向服务器发出HTTP请求,结果是JSON。该结果用于另一个C++函数,该函数使用EbBand导出。p> 当从js调用此导出函数时,它运行速度很快,无法存储导出函数的值,值为空,稍后2秒后函数完成,但从未分配值

复制步骤

1。我的测试/伪造webapi


2。Mi JS代码-Instance.JS

window.VModule({ noInitialRun: false }).then(module => {
     window.VMain = {
          Module: module
     };
});

window.GetData = async function GetData() {
     try {
          var url = "https://jsonplaceholder.typicode.com/todos/200"
          var options = {
               method: "GET",
               //mode: "cors",
               cache: "default"
          };
          var response = await fetch(new Request(url), options);
          var json = await response.json();
          console.log("DATA IN JS: " + json.title);
          return json.title;
     }
     catch (error) {
          console.log("DATA IN JS: ERROR_JS");
          return "ERROR_JS";
     }
}

3。我的C++代码-Meal.CPP -调用Instance.JS中定义的“window.GetData”的EM_JS_GetData函数 -GetData()调用EM_JS_GetData window.GetData()->EM_JS_GetData->GetData()->index.html中的按钮调用

#include <iostream>
#include <string>
#include <emscripten.h>
#include <emscripten/bind.h>
typedef std::string String;

EM_JS(const char *, EM_JS_GetData, (), {
    return Asyncify.handleSleep(function(wakeUp) {   
        window.GetData()
        .then(data=>{
            //Converting JsString to C-String
            var lengthBytes = lengthBytesUTF8(data)+1;
            var result = _malloc(lengthBytes);
            stringToUTF8(data, result, lengthBytes);
            wakeUp(result);
        })
    });
});

String GetData()
{
    try
    {
        const char *cstr = EM_JS_GetData();
        String result(cstr);
        free(static_cast<void*> (const_cast<char *>(cstr)));
        emscripten_console_log((u8"DATA IN C++: " + result).c_str());
        return result;
    }
    catch (...)
    {
        emscripten_console_log(u8"DATA IN CPP: ERROR_CPP");
        return "ERROR_CPP";
    }
}


int main(int argc, char ** argv) 
{
    std::cout<< "All components initialized" << std::endl;       
}

EMSCRIPTEN_BINDINGS(my_module) 
{
    using namespace emscripten;
    function("GetData", &GetData);
}

5。Index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Validatos - WebAssembly</title>
    <link rel="icon" href="Assets/favicon/favicon.ico">
    <script type="text/javascript" src="VModule.js"></script>
    <script type="module" src="Instance.js"></script>
</head>

<body>
    <button onclick="OnBtnClick()">Test</button>
    <script type="text/javascript">
        function OnBtnClick() {
            console.log("BEFORE");
            var title = window.VMain.Module.GetData();//RESULT FROM FUNCTION IS NOT ASSIGNED // THIS LINE IS EXECUTED QUICKLY // BUT GetData is now executing.
            console.log("DATA IN INDEX.HTML: " + title);//console prints empty string, value was assigned to empty string. GetData continues executing.
            console.log("AFTER");
        }
    </script>
</body>
</html>

如何同步调用window.VMain.Module.GetData()? 期望的行为

All components initialized
(index):17 BEFORE
Instance.js:19 DATA IN JS: ipsam aperiam voluptates qui
VModule.js:9 DATA IN C++: ipsam aperiam voluptates qui
(index):19 DATA IN INDEX.HTML: ipsam aperiam voluptates qui
(index):20 AFTER
All components initialized
(index):17 BEFORE
(index):19 DATA IN INDEX.HTML: 
(index):20 AFTER
Instance.js:19 DATA IN JS: ipsam aperiam voluptates qui
VModule.js:9 DATA IN C++: ipsam aperiam voluptates qui
All components initialized
(index):17 BEFORE
Instance.js:19 DATA IN JS: ipsam aperiam voluptates qui
VModule.js:9 DATA IN C++: ipsam aperiam voluptates qui
(index):19 DATA IN INDEX.HTML: ipsam aperiam voluptates qui
(index):20 AFTER