c++ Emspripten给出多个异步错误,而一个调用不是异步的

yrdbyhpb  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(106)

从JS我传递一个回调到C++。C++异步调用这个JS回调。

  • 如果JS回调函数从C++调用同步函数,它可以正常工作。
  • 如果JS回调调用了一个异步函数,它就可以正常工作。
  • 如果我把这两个电话合并,它就会崩溃。即使我使用await

错误是:RuntimeError: Aborted(Assertion failed: Cannot have multiple async operations in flight at once)我没有遇到任何人在这种情况下出现这种错误。
C++:

#include <emscripten/bind.h>
#include <iostream>

using namespace std;

void async_func(emscripten::val func) { func().await(); }
void sync_func() {}

EMSCRIPTEN_BINDINGS(async_test)
{
    emscripten::function("async_func", &async_func);
    emscripten::function("sync_func", &sync_func);
}

int main()
{
    return 0;
}

JS:

<html>
    <body>
        <script src="./out/build/em-x64-debug/async_test.js"></script>
        <script>
            async function async_cb(){
                // These lines work individually, but break when used simultaneously.
                await fetch('./test.txt')
                Module.sync_func()
            }

            Module['onRuntimeInitialized'] = () => {
                Module.async_func(async_cb)
            }
        </script>
    </body>
</html>

有谁知道如何解决这个问题,以及如何在异步获取后仍然调用C++函数?谢谢你,谢谢!

tcbh2hod

tcbh2hod1#

这是一种鸟枪式的回答,但我要说的是,Asyncify对它正在做的事情非常不透明,并且缺乏控制它是否 Package Embind调用的能力,这在复杂的项目中几乎是不可能科普的。我最好的建议是不要在你的项目中使用Asyncify,除非它是一个绑定到Asyncify的现有代码库。

相关问题