javascript可以一次运行多个功能吗?

时间:2017-06-09 19:57:00

标签: javascript multithreading

是否可以同时调用多个功能?

E.g。

var executed = false;
// loop 1
func();
// loop 2
func();

function func(){
    if (executed) return;
    executed = true;
    alert(1);
}

func()可以一次执行2次吗?

4 个答案:

答案 0 :(得分:3)

JavaScript不支持同时运行多个功能。从历史上看,它依赖于耗时的任务(例如等待HTTP请求或执行CPU密集型操作),而该原生代码会向JS提供API(并且该API接受回调或最近返回一个保证)。

这开始改变。

大多数Web浏览器都支持Web Workers,而Node.js引入了对Worker Threads的实验性支持。

每个都允许将JavaScript代码移植到一个独立的进程中,该进程独立于主事件循环运行,并使用消息与主进程进行通信。

答案 1 :(得分:1)

我所知道的任何处理器都不能同时执行语句。大多数计算机都有多个处理器,因此可以在多个处理器上运行多个语句。所以唯一可行的解​​决方案是打开浏览器两次,打开同一页面并希望js是并行执行的(或使用一些奇特的NodeJS或WebWorkers等)。

然而,不是运行同一时间,而是非常快速地在两个线程之间切换,因此它看起来像是同一时间(称为多任务处理)。你可以用这样的js做到这一点:

var executed = false;
var theother=new Promise( r=>setTimeout(r,0));
func();
// loop 2
func();

async function func(){
if (executed) return;
await theother;
executed = true;
alert(1);
}

或旧样式(解析魔法):

var executed = false;
// loop 1
func();
// loop 2
func();

function func(){
if (executed) return;
setTimeout(function(){
  executed = true;
  alert(1);
 },0);
}

答案 2 :(得分:0)

你不能这样做。因为JavaScript不支持多线程。 Web浏览器的每个选项卡只有一个解释器,浏览器中的JavaScript解释器是一个单独的线程。请参阅单线程here的示例。

另见this answer

答案 3 :(得分:-1)

使用以下代码

<!DOCTYPE html>
<html>
<head>
    <title>sample test</title>
    <script type="text/javascript">

        print=function(msg) {
            var ifunction=function(){
                console.log(msg);
            }
            return ifunction;
        };

        button1=function(name,count){
                for (var i =0 ;i <count; i++) {
                    setTimeout(print(name+":"+i+"seconds over after button1 click"),i*500);
                }
        };

    </script>
</head>
<body>
    <form>
        <input type="" name="" />
        <input type="button" value="button1" onclick="button1('button1',5)" />
        <input type="button" value="button2" onclick="button1('button2',5)" />
    </form>
</body>
</html>