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

问题描述 投票:0回答:1

我从 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++ 函数?谢谢!

javascript c++ emscripten
1个回答
1
投票

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

我还要说,有一种简洁但根本不是面向未来的方法可以让 Asyncify 停止包装 Embind 函数:

EM_ASM(
    Asyncify.whenDone = () => Promise.resolve();
);
© www.soinside.com 2019 - 2024. All rights reserved.