ForEach 内部的 setTimeout 不会等待给定的特定毫秒数

setTimeout inside ForEach does not wait with the specific ms given

ForEach console.log 非常快。但我需要它在 console.log Set 中的下一个项目之前每 8 秒等待一次。我试过 setTimeout 但它似乎没有 console.log 在给定的特定毫秒。

const completedIds = [];

//Dom mutation observer
const observeChat = new MutationObserver(function(mutationsList) {
  for (let mutation of mutationsList) {
    if (mutation.addedNodes.length) {


      for (i = 0; i < mutation.addedNodes.length; i++) {
mutation.addedNodes[i].firstChild.naturalWidth < 51 ? pm(mutation.addedNodes[i].firstChild.src.slice(-48, -12)) : false
      }
      
    }
  }
});
observeChat.observe(document.querySelector('.accounts-container__list'), {attributes: true, childList: true, subtree: false});

// Pm function
pm = ids => {
  observeChat.disconnect();
  if (!completedIds.includes(ids)) {
    const img = new Set().add(ids).forEach(function(id, index) {
      setTimeout(function() { // Not working. Does NOT print in console every 8sec
        console.log(id)
      }, index * 8000)
    })
  }
  observeChat.observe(document.querySelector('.accounts-container__list'), {attributes: true, childList: true, subtree: false});
}

这里有几个问题。

  1. 您正在创建一个只有一个条目的 Setadd 不会分散您提供的条目。如果你给它一个数组,你会得到一个只有那个数组的集合。我怀疑你想传播它。

  2. 集合的“索引”与其值相同,因此index * 8000将尝试将您刚刚添加的 ID 乘以 8000。它不是像 one 数组那样的索引forEach给你。

  3. img永远是undefined,因为Set.prototype.forEach的return值是undefined.

我怀疑您正在使用 Set 来获取唯一值。如果是这样,您想:

  1. 使用new Set(...ids)创建集合,

  2. 在使用之前将其转换回数组 forEach

  3. 以其他方式初始化img。我不清楚它的意思,所以我无法帮助这部分...

大致如下:

    [...new Set(ids)].forEach(function(id, index) {
//  ^^^^−−−−−−−^^^^^^−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− here
        setTimeout(function() {
            console.log(id);
        }, index * 8000);
    });

实例:

const ids = ["a", "b", "c"];
[...new Set(ids)].forEach(function(id, index) {
    setTimeout(function() {
        console.log(id, new Date());
    }, index * 8000);
});

或者,您可以使用带计数器的 for-of 循环:

let index = 0;
for (const id of [...new Set(ids)]) {
    setTimeout(function() {
        console.log(id);
    }, index++ * 8000);
}

实例:

let index = 0;
for (const id of [...new Set(ids)]) {
    setTimeout(function() {
        console.log(id);
    }, index++ * 8000);
}