forEach 循环中的 setTimeout

2023-12-04

如果满足特定条件,我想延迟调用 forEach 循环中的另一个函数,但我不理解这种情况下的 setTimeout 。

function checkName(person) {
    console.log('checking name of ' + person.name)
    if (person.name === 'Julie') return true 
}

function checkPersons() {
    var persons = [
        {name: 'Bob', age: 21},
        {name: 'Frank', age: 15},
        {name: 'Julie', age: 12}
    ]

    var results = []

    persons.forEach(function(person) {
        if (person.age >= 18) {
            console.log('do not need to check name of ' + person.name)
            results.push(person)
        } else {
            setTimeout(function() {
                if (checkName(person)) {
                    console.log('Julie is ' + person.name)
                    results.push(person)
                }
            }, 5000)
        }        
    }) 
}

checkPersons()

https://jsfiddle.net/nicholasduffy/sy7qpqu1/1/

I get

do not need to check name of Bob
// 5 second delay here
checking name of Frank
checking name of Julie
Julie is Julie

我希望每次通话时有 5 秒的延迟checkName

do not need to check name of Bob
// 5 second delay here
checking name of Frank
// 5 second delay here
checking name of Julie
Julie is Julie

正如其他人提到的,setTimeout 是异步的,因此 js 会触发 forEach 所有超时函数,等待时间为 5 秒。因此 5 秒后,所有内容都在“同一”时间运行。

为了避免这种情况,您可以创建一个队列并仅运行一个超时,然后在完成后调用下一个超时,或者在这种情况下,一种更简单的解决方案是根据您要迭代的人员的索引调整等待时间:

persons.forEach(function(person, index) { // we add index param here, starts with 0
    //your code
    else{
        setTimeout(function() {
            if (checkName(person)) {
                console.log('Julie is ' + person.name)
                results.push(person)
            }
        }, 5000*(index+1)) // or just index, depends on your needs
    }        
}) 

这样,第一个将在 5 秒后运行,第二个将在 10 秒后运行,第三个将在 15 秒后运行,依此类推

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

forEach 循环中的 setTimeout 的相关文章

随机推荐

  • Docker - 如何访问未附加到容器的卷?

    我有一个数据容器 其中有一个由其他容器使用的卷 volumes from 数据容器被意外删除 值得庆幸的是 该卷没有被删除 有什么方法可以重新运行数据容器并将其指向该卷吗 有什么方法可以重新运行数据容器并将其指向该卷吗 当然 我在 如何从已
  • 派生对象的模板是基类型模板的子类

    如果 apple 是 fruit 的子类 那么List
  • 如何使用 iText 在 Web 环境中通过智能卡签署 PDF?

    阅读以下参考文献 iText 数字签名白皮书 and C 示例 具体来说第4章 对于那些有兴趣的人 另一个精彩而简洁的总结PDF 签名过程 CAPICOM 文档 此处和 iText 邮件列表档案上的在线示例 问题 例如here and he
  • Jekyll 插件中的“优先级”标志应该如何工作?

    我目前正在尝试为 Jekyll 开发一个插件 这将有助于使用云数对于响应式图像 当前源是在我的 Github 仓库中 稍后当 如果它有效时 我会将其变成宝石 这个插件有两个特点 用于定义 Cloudinary 图像的 Liquid 标签 例
  • 如何对没有逻辑的类进行单元测试?

    我发现为算法编写单元测试很容易 例如 sort List 很容易编写如下测试 list 2 1 4 assert sort list 1 2 4 但我发现测试没有逻辑的方法真的很难 没有if语句 只是一组调用 我主要想知道如何对它们进行单元
  • Codeigniter - 无法调用系统的 lang() 函数

    尝试调用属于 codeigniter 系统 帮助程序 language helper php 一部分的 lang 函数 导致致命错误 Fatal error Call to undefined function lang def actio
  • facebook feed 方法链接默认添加 fb_ref=Default 在最后如何删除

    我正在使用 feed 方法从我的网站使用 asp net 和 jquery javascript 发布到我的 facebook 墙 最初它工作正常 但突然在最后的链接中添加了 fb ref Default 我不知道为什么会发生我想删除请帮助
  • 使用 ARC 避免出现悬空指针

    我有一个物体 里面有一个strong对对象的引用 property nonatomic strong NSObject thing 在其他地方 我有一个传递对象引用的方法 thirdObject doSomething secondObje
  • 对 MySQL 表中的行重新排序

    我有一张桌子 ID Name Order 1 John 1 2 Mike 3 3 Daniel 4 4 Lisa 2 5 Joe 5
  • 无法使用 http/https 将 Git 推送到远程存储库

    我在服务器上的 apache 提供的目录中有一个 Git 存储库 我已经配置了 WebDAV 并且它似乎运行正常 Litmus 返回 100 成功 我可以从远程主机克隆我的存储库 但是当尝试推送 http 或 https 时 出现以下错误
  • Azure SQL 数据仓库的简单性能测试

    我们正在努力将现有应用程序移植到 Azure SQL 数据仓库 为了更好地了解 Azure SQL 数据仓库的性能 工作负载管理特征 功能 我设置了一个我认为非常简单的测试 我加载了一个静态表 即我们企业的日历 包含大约 20k 行 即对于
  • 能够使用附近连接同时向多个设备发送消息/字节

    为了尝试附近的 API 我决定构建一个应用程序 允许老师跟踪学生在课堂上的出勤情况 类似于什么张嘉伦是在做 我已经经历了谷歌关于剪刀石头布和对讲机的示例代码 但似乎只有一个设备可以连接在任何一个时间当我使用 4 部手机测试样本时 我想构建一
  • 使用 selenium 滚动抓取 javascript 表

    我正在尝试抓取通过 javascript 生成的表格 但我很挣扎 到目前为止我的代码是 driver webdriver Chrome driver get https af ktnlandscapes com get table firs
  • 如何导出具有依赖关系的 SVN 存储库的一部分?

    我正在尝试使用迁移 SVN 存储库的一部分svnadmin dump 提供的 svndumpfilter 工具不管理导出中未包含的目录的复制 移动 重命名依赖项 有没有一个工具可以管理这些依赖关系 我发现了 Simon Tatham 的一个
  • 为每个类别选择 N 条记录并按 X 排序

    我有一个包含博客文章的数据库表 我想在主页上显示每个类别的一篇 或多篇 帖子 例如按日期排序 所以我的帖子表如下所示 id title description cat filename date 我将如何创建这样的查询 我想过使用 grou
  • 如何计算正弦曲线两端的面积

    给定这个数据集 y lt c 13 16 35 40 28 36 43 33 40 33 22 5 27 31 29 25 26 31 26 24 25 29 23 4 t lt 1 24 我的目标是计算两个面积 第一个区域将仅集成来自零线
  • 使用 Grunt Uglify 进行动态映射和连接

    我正在尝试使用动态映射并使用 Grunt Uglify 连接 Javascript 文件 我有以下无法正常工作的情况 这是我的文件夹结构 javascript account custom js bills billing one js b
  • elasticsearch:如何索引仅是停用词的术语?

    我在后台使用 elasticsearch 构建了自己的小搜索 取得了很大的成功 但有一件事我在文档中找不到 我正在索引音乐家和乐队的名字 有一个名为 The The 的乐队 由于停用词列表 该乐队从未被索引 我知道我可以完全忽略停用词列表
  • 自定义注释图像仅在程序开始时旋转(Swift-iOS)

    请在这里帮助新手 iOS 开发者 所以 我有一个计时器 它定期从提供公交车实时位置的 xml 表中获取公交车的纬度和经度 我能够设置解析器 为总线运动设置动画并为总线设置自定义 箭头 图像 然而 问题是 每次获得纬度和经度的新值时 我无法旋
  • forEach 循环中的 setTimeout

    如果满足特定条件 我想延迟调用 forEach 循环中的另一个函数 但我不理解这种情况下的 setTimeout function checkName person console log checking name of person n