如何在Javascript中创建后台进程

How to create a background process in Javascript

本文关键字:创建 后台进程 Javascript      更新时间:2023-09-26

我正在编写一个web进程来模拟Connect4棋盘游戏。我使用一个敏捷控制器来设置它,它有七列六行,每个单元格引用为c1r1,如下所示。

$scope.c1r1 = $scope.counterWhite;
$scope.c1r2 = $scope.counterWhite;
$scope.c1r3 = $scope.counterWhite;
.
.
$scope.c7r4 = $scope.counterWhite;
$scope.c7r5 = $scope.counterWhite;
$scope.c7r6 = $scope.counterWhite;

当用户点击任何单元格时,它会引发一个事件,我想显示计数器在可用单元格中的下降,代码如下

$scope.c1r1 = $scope.counterYellow;
setTimeout(fillC1(), 1000);        
$scope.c1r1 = $scope.counterWhite; 
$scope.c1r2 = $scope.counterYellow;
setTimeout(fillC1(), 1000);        
$scope.c1r2 = $scope.counterWhite; 
$scope.c1r3 = $scope.counterYellow;
setTimeout(fillC1(), 1000);        
$scope.c1r3 = $scope.counterWhite; 
$scope.c1r4 = $scope.counterYellow;
setTimeout(fillC1(), 1000);        
$scope.c1r4 = $scope.counterWhite; 
$scope.c1r5 = $scope.counterYellow;
setTimeout(fillC1(), 1000);        
$scope.c1r5 = $scope.counterWhite; 
$scope.c1r6 = $scope.counterYellow;

当我运行它时,什么都没发生,计数器只出现在底部,所以我需要一个线程来使它正常工作,但由于JavaScript不执行线程,我想知道是否还有其他答案,比如Web Workers。

对,设置单元格的方式是问题的一部分。

使用数组代替$scope.cXrY变量的负载:

$scope.cells = [];
var x, y;
for(x = 0; x < 7; x ++){
    $scope.cells[x] = [];
    for(y = 0; y < 6; y ++){
        $scope.cells[x][y] = $scope.counterWhite;
    }
}

好了,所有单元格都在一个变量中
您应该使用$scope.cells[2][4]而不是$scope.c2r4

现在,对于检查细胞的计数器:

function iterateOverCells(){
    fillC1()
    $scope.cells[x][y] = $scope.counterWhite; // Make the previous cell white
    x++;        // Get next cell position
    if(x >= 7){
        x = 0;
        y++;
    }
    $scope.cells[x][y] = $scope.counterYellow; // Current cell yellow
    if(x < 7 && y < 6)                         // If we're not at the last cell
        setTimeout(iterateOverCells, 1000);    // Go to the next cell in 1 second
}
var x = 0, y = 0;
$scope.cells[x][y] = $scope.counterYellow; // Make the first cell yellow
setTimeout(iterateOverCells, 1000);        // Next cell in 1 second

Web Workers没有访问DOM的权限,它们用于计算。我不知道你为什么要使用后台线程,但以下是你可以做到的:

假设你用后台代码编写了一个脚本,当完成任务时,它会发布消息(稍后会返回:

function doWork() {
    postMessage("did something");
    setTimeout(doWork, 2000);
}
doWork();

现在,检查浏览器是否支持网络工作者,创建一个,并监听从中发布的消息:

if(typeof(w) == "undefined") {
    executer = new Worker("background.js");
}
executer.onmessage = function(event){
    document.getElementById("results").innerHTML = event.data;
};

当你用完它后,你可以这样删除它:executer.terminate();