我从 JS 向 C++ 传递回调。 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++ 函数?谢谢!
这是一种霰弹枪式的回复,但我要说的是,Asyncify 对于它正在做的事情非常不透明,并且缺乏控制它是否包装 Embind 调用的能力,在复杂的项目中几乎不可能应对。我最好的建议是不要在项目中使用 Asyncify,除非它是与 Asyncify 绑定的现有代码库。
我还要说,有一种简洁但根本不是面向未来的方法可以让 Asyncify 停止包装 Embind 函数:
EM_ASM(
Asyncify.whenDone = () => Promise.resolve();
);