javascript - 经过一些研究,循环和 setTimeout 函数仍然不起作用

标签 javascript

我做了一些关于循环和 setTimeout 函数的研究,但它仍然没有像我希望的那样工作......

它同时打开所有链接没有每个打开的链接有 5 秒的延迟。

我希望它在打开每个链接后延迟 5 秒。

代码:

var links = document.querySelectorAll('a[class="mn-person-info__link ember-view"][id^="ember"]')
for (var i = 1; i <= links.length; i++) {
    (function(index) {
        setTimeout(function() { 
            window.open(links[index].href,'_blank'); 
        }, 5000);
    })(i);
}

最佳答案

使用 Promise链条和Array#reduce() ,你可以这样做:

var links = document.querySelectorAll('a[class="mn-person-info__link ember-view"][id^="ember"]');

Array.from(links).reduce((chain, { href }) => {
  return chain.then(() => new Promise(resolve => {
    window.open(href, '_blank');
    setTimeout(resolve, 5000);
  }));
}, Promise.resolve())

如果您不想做这么花哨的事情,并且可以一次设置所有超时,则可以使用 let 简化 for 循环而不是 varIIFE :

var links = document.querySelectorAll('a[class="mn-person-info__link ember-view"][id^="ember"]');

for (let i = 0; i < links.length; i++) {
  setTimeout(function() { 
    window.open(links[i].href, '_blank'); 
  }, 5000 * i);
}

或者更简单,使用 for...ofobject destructuring :

var links = document.querySelectorAll('a[class="mn-person-info__link ember-view"][id^="ember"]');
var i = 0;

for (const { href } of links) {
  setTimeout(function() { 
    window.open(href, '_blank'); 
  }, 5000 * i++);
}

关于javascript - 经过一些研究,循环和 setTimeout 函数仍然不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45111177/

相关文章:

javascript - 数据发送到 api 后更新 react 状态

javascript - 页面跳起来而不是向上滚动

javascript - "Unsafe JavaScript attempt to access frame with URL..."与本地文件

javascript - .net mvc 5 不引人注目的禁用字段验证

javascript - 相当于 C# LINQ GroupBy 的 Typescript 是什么?

javascript - 在 javascript 中动态显示带有 for 循环换行符的警告框

javascript - 发送两个nodejs http请求,第二个依赖第一个

javascript - 新日期无法给我正确的时间

javascript - 从点击绑定(bind)调用方法

javascript - 从其他页面获取值(value)