javascript 我如何解析一个有延迟的数组,并在它被循环时修改它?

kb5ga3dv  于 2023-01-16  发布在  Java
关注(0)|答案(2)|浏览(101)

我需要一个函数,它可以循环通过一个数组,同时考虑延迟,而不是在通过数组时一次性添加延迟。
我需要什么的例子:

const array = [ 0.06, 0.08, 0.04, 0.05, 0.06, 0.03 ];

loop(array); // this is the function

userInputForStop(); // my function where something causes the array to be deleted/set to []

我试过了

const array = [ ""var array = [ "this", "is", "not", "going", "to", "work" ];
for (var i = 0; i < array.length; i++) {
  (function (i) {
    setTimeout(function () {
      if(i == "going") array = [];
      console.log(array[i])
    }, 1000 * i);
  })(i);
};

这个方法不起作用,因为for循环已经遍历了每一项,并且已经设置了超时,因此当项匹配"going"时,它不会停止后面的任何内容。
我看过很多关于延迟数组的帖子,尽管它们似乎都解析了数组中的所有元素,并将延迟乘以计数器(这不是我想要的)。
我想要一个循环函数,可以让我完全停止任何循环的值后,某一项目。(但也有延迟之间的每个值)

rqcrx0a6

rqcrx0a61#

我们可以尝试重新创建某种带有promise的sleep function in JavaScript,然后在循环中使用sleep函数,因为循环遵循await

const delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms));

const array = ["this", "is", "definitely", "going", "to", "work"];

(async () => {
  for (const item of array) {
      if (item === "going") array.length = 0;

      console.log(item);

      await delay(100);
  }
})();

如果你写一个使用这个sleep函数的异步生成器,我们可以用for-await loops来简化核心循环:

const delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms));

const array = ["this", "is", "definitely", "going", "to", "work"];

async function* delayedIterator(array, ms) {
    for (const item of array) {
        yield item;
        
        await delay(ms);
    }
}

(async () => {
    for await (const item of delayedIterator(array, 100)) {
        if (item === "going") array.length = 0;
        
        console.log(item);
    }
})();
eni9jsuy

eni9jsuy2#

很难理解你的用例是什么(这会有很大帮助),但是你可以清除未来的计时器:

const timers = []
const array = [ ""var array = [ "this", "is", "not", "going", "to", "work" ];
for (var i = 0; i < array.length; i++) {
  (function (i) {
    timers.push(setTimeout(function () {
      if(array[i] == "going") {
         for (var j = i + 1; i < timers.length; j++) {
             clearTimeout(timers[j])
         }
         array = [];
         
      }
      console.log(array[i])
    }, 1000 * i));
  })(i);
};]

相关问题