当前位置: 首页 > 知识库问答 >
问题:

javascript - 如何在JavaScript中从外部中断for循环的执行?

郑星辰
2024-09-19

js中如何从外部中断for循环,起因是这段代码上层会反复进入这个for循环,每次进入的时候需要清除之前的执行效果,所以需要在循环外部来取消?大佬们知道如何做吗?

let progress = 0;
const listLength = 99999;
for (let i = 0; i < listLength; i++) {
    progress = (i+1) / listLength * 100;
    console.log('进度',progress);
}

之前尝试过,通过变量来中断,但是并没有达到实际效果。

let isBreak = false;
let progress = 0;
const listLength = 99999;
for (let i = 0; i < listLength; i++) {
    if (isBreak) break;
    progress = (i+1) / listLength * 100;
    console.log('进度',progress);
}

//尝试改变isBreak的值,延时队列会在for循环完成后才执行,顺序执行也是如此
//以上是内部中断,无法实现,考虑有没有外部中断的方式

共有4个答案

漆雕育
2024-09-19

我还尝试过一种笨方法,就是for循环内部每一个循环的内容执行过程都加到setTimeout中,把状态存下来,二次进入的时候统一循环clearTimeout销毁之前的;但是这种情况下无法收集progress进度。

鞠征
2024-09-19

你这代码没有给出任何break的条件, 等同于直接 process = 1;

井翰
2024-09-19

使用异步:

class AsyncState<T> {
    constructor(private state: T) {}
    get value(): Promise<T> {
        return Promise.resolve(this.state)
    }
    set value(newState: T) {
        this.state = newState
    }
}

const pState = new AsyncState(0)

async function printProgress(listLength = 99999) {
    const state = (await pState.value) + 1
    pState.value = state
    for (let i = 0; i < listLength; i++) {
        if (state < (await pState.value)) {
            console.log(`${state} 停止`)
            return
        }
        console.log('进度', ((i + 1) / listLength) * 100)
    }
}

printProgress(100)
queueMicrotask(() => printProgress(10))

输出:

进度 1
进度 2
进度 10
1 停止
进度 20
进度 30
...
进度 100

注意,需要在微任务(Promise)中调用 printProgress 才会取消上一次的调用。

周意智
2024-09-19

javascript单线程,你这个for循环也是同步的,
所以,当你已经开始for循环时,修改isBreak的值为true,
需要等for循环执行完成,才能将isBreak的值修改为true.


如果需要从外部中断,需要改成异步for循环,代码如下

const sleep = (time) => new Promise(resolve => setTimeout(resolve, time))
let globalBreak = false
async function startFor() {
    for (let i = 0; i <= 10; i++) {
        await sleep(1000)
        if (globalBreak) { break }
        console.log('i:' + i)
    }
}

startFor()
setTimeout(function() {
   globalBreak = true
}, 3000)
 类似资料:
  • 问题内容: 如何在响应Swift中的语句的嵌套结构中打破外部循环? 例如: 将只会让我离开的,而在斯威夫特,它具有为空的情况下不得使用。如何完全从中退出循环? 问题答案: Swift允许带标签的语句。使用带标签的语句,无论嵌套循环的深度如何,您都可以指定要从哪个控制结构开始(尽管从可读性的角度来看,通常嵌套越少越好)。这也适用于。 例:

  • 如果我像下面这样做一个异步调用,如何将它们与promise联系起来,这样我就可以按顺序做事了?在这个例子中,最终发生的是会将项按顺序推入。我更喜欢有promise的回答,但只要有效,什么都行

  • 问题内容: 我希望打破PHP中的外部for / foreach循环。 可以在ActionScript中完成,如下所示: PHP等效项是什么? 问题答案: 对于2个嵌套循环: http://php.net/manual/en/control- structures.break.php

  • <---JS StackTrace---> =====JS栈迹=================================================================== 安全上下文:0x10178C2CFB51 2:main[/run-N6KBYU8CQZCNEXKH0TBM/solution.JS:~30][PC=0x2859725AEC0](this=0x10178

  • 问题内容: 警报仅执行一次,是否有可能在迭代中每次执行警报? 问题答案: 是的,通过将其更改为,请注意“ myScript” + i,它会在每次迭代中更改密钥:

  • 问题内容: 我在Javascript中遇到了奇怪的行为。我懂了 “对象不支持此属性或方法” 以下代码中的函数异常: 当我使用以下代码更改代码时,问题消失了: inside的值是多少? 问题答案: 不要用于数组迭代。 重要的是要了解,用于访问索引的Javascript数组的方括号语法()实际上是从… 继承的。 该结构不能像其他语言(php,python等)中所看到的那样更传统。 Javascript

  • 问题内容: 我一直在尝试并行化以下脚本,特别是for循环。我怎样才能做到这一点? 问题答案: 更换 与

  • 并分别处理这两个数组。这是更好的解决方案吗?