这是我想向你们的天才编码员汇总的问题: 我有一个用C ++编写的自定义Web容器,可以与javascript通信。 从C ++到JS,它可以执行同步JS函数调用 从JS到C ++,它可以进行异步C ++函数调用
使用这些工具,我必须进行从JS到C ++的同步调用 ... 因为我不能使用消息通信系统(因为它暗示主线程上的异步性,除非我错过了什么),我的第一个猜测是使用工作线程
“main.js”文件
var synctools = false;
var syncdata ="";
var myworker=new worker("demo_workers.js");
while(synctool == false){} //It s ugly but i haven t had any other ideas
“demo_workers.js”文件
CallCPPFile(param,callback); //call the c++ and c++ call callback when finished
function callback(data)
{
//do stuff
syncdata = data;
synctools = true; //this is supposed to stop the looping of the main js
}
不幸的是,工作线程无法访问synctools和syncdata。 所以这里有几个问题:
感谢您的帮助
答案 0 :(得分:0)
这是你问题的基本要点。异步系统中的同步需要双方合作。您的问题是,完全隔离的一段代码不能更新任何数据,除非它自己这样做。由于所有JavaScript线程彼此完全隔离,除非您编写某种可以等待您的外部可调用线程,否则您将陷入困境。这个问题没有纯粹的JavaScript解决方案。
但是,如果你不介意再编写一些C ++,那么你可以做一些笨拙的事情并让事情发挥作用:
创建一个多线程迷你html服务器。 设计服务器以获取id(由调用者提供)作为参数,为数据创建存储点并等待。 设计服务器以获取id和data作为参数。接收数据参数时,将设置与接收到的ID关联的存储点,并删除与该ID关联的等待。
这允许1个javascript线程在具有同步AJAX请求的另一个线程上等待。唯一的要求是等待线程使用postMessage在等待之前将等待ID发送到目标线程。
第二个想法,只要你可以在一个单独的线程中创建一个http服务器,这样的事情也可以在纯JavaScript中完成。诀窍是保持http连接打开,直到响应准备就绪。这完全取决于您正在使用的JavaScript环境。