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});
}
这里有几个问题。
您正在创建一个只有一个条目的 Set
。 add
不会分散您提供的条目。如果你给它一个数组,你会得到一个只有那个数组的集合。我怀疑你想传播它。
集合的“索引”与其值相同,因此index * 8000
将尝试将您刚刚添加的 ID 乘以 8000。它不是像 one 数组那样的索引forEach
给你。
img
永远是undefined
,因为Set.prototype.forEach
的return值是undefined
.
我怀疑您正在使用 Set
来获取唯一值。如果是这样,您想:
使用new Set(...ids)
创建集合,
在使用之前将其转换回数组 forEach
以其他方式初始化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);
}
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});
}
这里有几个问题。
您正在创建一个只有一个条目的
Set
。add
不会分散您提供的条目。如果你给它一个数组,你会得到一个只有那个数组的集合。我怀疑你想传播它。集合的“索引”与其值相同,因此
index * 8000
将尝试将您刚刚添加的 ID 乘以 8000。它不是像 one 数组那样的索引forEach
给你。img
永远是undefined
,因为Set.prototype.forEach
的return值是undefined
.
我怀疑您正在使用 Set
来获取唯一值。如果是这样,您想:
使用
new Set(...ids)
创建集合,在使用之前将其转换回数组
forEach
以其他方式初始化
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);
}