从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++函数?谢谢你,谢谢!
1条答案
按热度按时间tcbh2hod1#
这是一种鸟枪式的回答,但我要说的是,Asyncify对它正在做的事情非常不透明,并且缺乏控制它是否 Package Embind调用的能力,这在复杂的项目中几乎是不可能科普的。我最好的建议是不要在你的项目中使用Asyncify,除非它是一个绑定到Asyncify的现有代码库。