【问题标题】:How do I make my program wait 10ms before executing a function in javascript?如何让我的程序在 javascript 中执行函数之前等待 10 毫秒?
【发布时间】:2021-11-17 02:14:37
【问题描述】:

我希望我的程序在执行“TryNumber”函数之前等待 10 毫秒。当我尝试使用 setTimeOut 时,我的代码似乎中断并输出了所有的,而不是解决数独问题。 我希望它等待 10 毫秒的原因是因为我希望每次尝试新号码时都能在屏幕上看到它。

该程序没有 setTimeOut 和没有 异步功能。

async function SolveSudoku(sudoku, sudokuID) {
    let filledNumbers = GetFilledNumbers(sudoku);
    let number, i, j;
    let backtracked = [];
    for (let i = 0; i < 9; i++) {
        for (let j = 0; j < 9; j++) {
            temp = '#sudoku' + i + j;
            sudokuID[i][j] = document.querySelector(temp);
        }
    }
    for (i = 0; i < 9; i++) {
        for (j = 0; j < 9; j++) {
            number = 0;
            while (filledNumbers[i][j] == false) {
                setTimeout(function () {
                    if (number < 9)
                        number++;
                    else {
                        sudoku[i][j] = 0;
                        backtracked = Backtrack(i, j, filledNumbers);
                        i = backtracked[0];
                        j = backtracked[1];
                        number = sudoku[i][j] + 1;
                    }

                    if (number <= 9 && TryNumber(sudoku, i, j, number)) {
                        sudoku[i][j] = number;
                        sudokuID[i][j].classList.remove("border-red");
                        sudokuID[i][j].classList.add("border-green");
                        break;
                    }
                    sudoku[i][j] = number;


                    sudokuID[i][j].textContent = number;
                    sudokuID[i][j].classList.add("border-red");
                }, 10);
                
                
            }
        }
    }
    return sudoku;
}

function TryNumber(sudoku, row, column, number) {
    let pos = [row, column];
    let box = GetBox(pos);
    for (let i = 0; i < 9; i++) {
        if ((number == sudoku[row][i] && i != column) || (number == sudoku[i][column] && i != row))
            return false;
    }
    for (let i = box[0] * 3; i < box[0] * 3 + 3; i++) {
        for (let j = box[1] * 3; j < box[1] * 3 + 3; j++) {
            if (number == sudoku[i][j] && (i != row || j != column))
                return false;
        }
    }
    return true;
}

function GetFilledNumbers(sudoku) {
    let filledNumbers = [[], [], [], [], [], [], [], [], []];
    for (let i = 0; i < 9; i++) {
        for (let j = 0; j < 9; j++) {
            if (sudoku[i][j] != 0)
                filledNumbers[i][j] = true;
            else
                filledNumbers[i][j] = false;
        }
    }
    return filledNumbers;
}

function GetBox(pos) {
    let box = [];
    if (pos[0] / 3 < 1) {
        box[0] = 0;
    }
    else if (pos[0] / 3 < 2) {
        box[0] = 1;
    }
    else {
        box[0] = 2;
    }

    if (pos[1] / 3 < 1) {
        box[1] = 0;
    }
    else if (pos[1] / 3 < 2) {
        box[1] = 1;
    }
    else {
        box[1] = 2;
    }

    return box;
}

function Backtrack(row, column, filledNumbers) {
    do {
        if (column > 0) {
            column--;
        }
        else {
            column = 8;
            row--;
        }
    } while (filledNumbers[row][column]);
    return [row, column];
}

//main
const button = document.querySelector('#bt-test');
const button2 = document.querySelector('#bt-test2');

let temp;
let sudokuID = [[], [], [], [], [], [], [], [], []];
let sudoku = 
[
    [ 8, 0, 0, 0, 1, 0, 6, 0, 9 ],
    [ 0, 0, 1, 9, 7, 0, 0, 2, 0 ],
    [ 9, 4, 0, 8, 2, 6, 3, 0, 1 ],
    [ 0, 0, 4, 6, 0, 0, 0, 0, 0 ],
    [ 0, 9, 0, 0, 0, 0, 1, 6, 0 ],
    [ 5, 0, 6, 0, 3, 2, 9, 8, 0 ],
    [ 4, 0, 0, 0, 5, 8, 7, 1, 0 ],
    [ 6, 2, 0, 1, 0, 0, 5, 3, 0 ],
    [ 0, 5, 8, 0, 0, 7, 4, 0, 2 ]
    ];




button.addEventListener('click', function () {
    for (let i = 0; i < 9; i++) {
        for (let j = 0; j < 9; j++) {
            temp = '#sudoku' + i + j;
            sudokuID[i][j] = document.querySelector(temp);
            sudokuID[i][j].textContent = sudoku[i][j];

        }
    }
})

button2.addEventListener('click', function () {
    solvedSudoku = SolveSudoku(sudoku, sudokuID);
    for (let i = 0; i < 9; i++) {
        for (let j = 0; j < 9; j++) {
            sudokuID[i][j].textContent = solvedSudoku[i][j];

        }
    }
})

【问题讨论】:

  • 我在代码中没有看到setTimeout。没有setTimeout,程序可以工作吗?
  • 请添加您的其余代码,以便其他用户可以帮助您,同时能够重现您的问题。
  • @radarbob 该程序在没有它的情况下也可以工作,但是一旦我尝试将它放入并且我使函数异步它就会中断
  • @pazitos10 我已经添加了其余的代码
  • @Aristos 谢谢!!

标签: javascript asp.net settimeout


【解决方案1】:

您必须在此处创建一个所有参数都在外部的开环 - 我将根据您的代码为您提供一个示例,但您需要对其进行处理以使其成为最终版本。

<script>
    // global            
    i = 0; MaxI = 9;
    j = 0; MaxJ = 9;
    number = 0;
    itrnLoop = null;

    // --run this--
    function RunOpenLoop()
    {
        Init();
        itrnLoop = setInterval(TheOutLoop, 100);
    }

    // in case you need to run it again
    function Init() {
        i = 0; MaxI = 9;
        j = 0; MaxJ = 9;
        number = 0;
    }

    // here is the real loop
    function TheOutLoop()
    {
        // put here your logic
        console.log("i:" + i + " j:" + j + " number:" + number);

        if (number < 9)
            number++;

        // increase i,j until the end of them
        j++;
        if (j == MaxJ) {
            j = 0;
            i++;
        }

        if (i == MaxI) {
            // the end
            clearInterval(itrnLoop);
        }
    }
<script>

输出每行延迟100毫秒

i:0 j:0 number:0
i:0 j:1 number:1
i:0 j:2 number:2
i:0 j:3 number:3
i:0 j:4 number:4
i:0 j:5 number:5
i:0 j:6 number:6
i:0 j:7 number:7
i:0 j:8 number:8
i:1 j:0 number:9
i:1 j:1 number:9
i:1 j:2 number:9
i:1 j:3 number:9
i:1 j:4 number:9
i:1 j:5 number:9
i:1 j:6 number:9
i:1 j:7 number:9
i:1 j:8 number:9
i:2 j:0 number:9
i:2 j:1 number:9
i:2 j:2 number:9
i:2 j:3 number:9
i:2 j:4 number:9
i:2 j:5 number:9
i:2 j:6 number:9
i:2 j:7 number:9
i:2 j:8 number:9
i:3 j:0 number:9
i:3 j:1 number:9
i:3 j:2 number:9
i:3 j:3 number:9
i:3 j:4 number:9
i:3 j:5 number:9
i:3 j:6 number:9
i:3 j:7 number:9
i:3 j:8 number:9
i:4 j:0 number:9
i:4 j:1 number:9
i:4 j:2 number:9
i:4 j:3 number:9
i:4 j:4 number:9
i:4 j:5 number:9
i:4 j:6 number:9
i:4 j:7 number:9
i:4 j:8 number:9
i:5 j:0 number:9
i:5 j:1 number:9
i:5 j:2 number:9
i:5 j:3 number:9
i:5 j:4 number:9
i:5 j:5 number:9
i:5 j:6 number:9
i:5 j:7 number:9
i:5 j:8 number:9
i:6 j:0 number:9
i:6 j:1 number:9
i:6 j:2 number:9
i:6 j:3 number:9
i:6 j:4 number:9
i:6 j:5 number:9
i:6 j:6 number:9
i:6 j:7 number:9
i:6 j:8 number:9
i:7 j:0 number:9
i:7 j:1 number:9
i:7 j:2 number:9
i:7 j:3 number:9
i:7 j:4 number:9
i:7 j:5 number:9
i:7 j:6 number:9
i:7 j:7 number:9
i:7 j:8 number:9
i:8 j:0 number:9
i:8 j:1 number:9
i:8 j:2 number:9
i:8 j:3 number:9
i:8 j:4 number:9
i:8 j:5 number:9
i:8 j:6 number:9
i:8 j:7 number:9
i:8 j:8 number:9

【讨论】:

    猜你喜欢
    • 2019-09-03
    • 2021-01-07
    • 2012-03-06
    • 1970-01-01
    • 1970-01-01
    • 2010-11-13
    • 1970-01-01
    • 2021-04-05
    • 2015-05-02
    相关资源
    最近更新 更多