web workers各浏览器下参数传递的差异

发布于 2022-09-07 23:41:38 字数 2258 浏览 10 评论 0

做军旗游戏时想用web workers消除计算时界面的停滞,实现了后发现在firefox下正常,但在chrome/safari下却不能用,网上关于web workers的资料太少了,也可能是因为我没找到,结果就一直debug了半天,才找出原因所在,原因就是:chrome/safari下,web worker传递的参数全都会被转换成字符串。

chrome/safari下,只能用字符串通信,无法传递其他数据,无论是数组,object,布尔值,数值,全都会被转成字符串,而在firefox下则支持所有数据类型的传递。

看这段示例代码,以下测试在firefox3.5 safari4.0.5 chrome4.1下进行:

HTML:

<!DOCTYPE HTML PUBLIC "-//W3C/DTD HTML4.0 Transitional//EN">
<html>
<head>
        <title>Test threads fibonacci</title>
</head>
<body>
    <script type="text/javascript">
                var worker = new Worker("testWorker.js";
                worker.onmessage = function (event) {
                        alert("type:" + typeof event.data);
                        alert(event.data[1]);
                };
                worker.postMessage([2,3]);
    </script>
</body>
</html>
testWorker.js:

onmessage = function (event) {
    postMessage(event.data.name);
};
safari/chrome显示:type:string “,”(字符串”2,3″第二个字符)
firefox显示:typebject 3(数组第二个元素)

可以把worker.postMessage([2,3]);的参数改成其他类型试试,safari/chrome显示出来的type都是string。

写出来好简单,发现这个却花了我挺多时间,firefox对google创造出来的东西的支持比chrome还好,真是奇怪~

附:
还有一个有点难发现的错误,网上有些示例教程在写worker的内置函数时在前面加了var,这样在firefox下正常,在safari/chrome下出错:

var onmessage = function(e){
    postMessage(e.data);
}
正确写法是不加var

onmessage = function(e){
    postMessage(e.data);
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文