0

我写了一个代码,它不会停止该功能,但是有没有这样的方法呢?或者也许有更好的方法......

let stopper = false;

const toBeLowPriority = () => {
    for(let i = 0; i < Math.pow(10, 9); i += 1) {
        if(stopper) {
            console.log("for loop stopped");
            return
        }
        
        // do some stuff
        let k = Math.random();
        if (k === 0.5) {
            console.log(k);
        }
    }
    console.log("for loop done fully");
}


setTimeout(
    () => {
        stopper = true;
    }, 500
);


toBeLowPriority();
4

1 回答 1

0

由于您的方法toBeLowPriority必须在进入 setTimeout 之前结束,因此这永远不会发生。

您可以将函数更改为只运行几次,然后在 setImmediate 上继续。(或超时)

让塞子=假;

const toBeLowPriority = (start=0, end = Math.pow(10, 9), checkEvery = 1000) => {
    for(let i = start; i < end; i++) {
        if(stopper) {
            console.log("for loop stopped at", i);
            return
        }
        // do some stuff
        let k = Math.random();
        if (k === 0.5) {
            console.log(k);
        }

        if( i >= checkEvery) {
            return setImmediate( () => toBeLowPriority(i, end, checkEvery) );
        }
    }
    console.log("for loop done fully");
}

toBeLowPriority();

setTimeout(
    () => {
        stopper = true;
    }, 500
);

是的,现在 toBeLowPriority 不再同步。

stopped必须为这种情况设计的功能。但是由于当前 JS 中的几乎所有内容都是异步的,因此您可能永远不会在现实生活中遇到这种情况。

于 2020-11-04T22:00:02.903 回答