You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现while循环在满足指定条件或超时后自动终止?

带匹配终止+超时自动退出的while循环实现方案

原代码存在的问题

  • 目录读取逻辑放在while循环外部,只会执行一次,循环内永远拿不到最新的目录内容,无法检测到后续新增的目标文件
  • fs.readdirSync返回的是目录下所有文件名组成的数组,不能直接和单个文件名做全等判断,匹配逻辑本身无效
  • 没有超时判断逻辑,只要未匹配到文件就会进入死循环
  • 同步读取目录的方法会阻塞Node.js事件循环,结合死循环会直接导致进程卡死

可直接使用的实现代码

const fs = require('fs/promises')

async function checkFile (filePath, targetFilename, timeout = 30 * 1000) {
  // 记录循环启动时间,用于超时判断
  const startTime = Date.now()
  while(true) {
    // 优先判断是否超时,避免无意义的资源消耗
    const elapsedTime = Date.now() - startTime
    if (elapsedTime >= timeout) {
      // 可根据业务需求调整超时后的处理逻辑,不需要抛错直接break即可
      throw new Error(`等待目标文件超时,累计等待${elapsedTime}ms`)
    }
    // 每次循环重新读取当前目录的最新文件列表
    const currentFiles = await fs.readdir(filePath, 'utf-8')
    // 判断目标文件是否存在
    if (currentFiles.includes(targetFilename)) {
      // 匹配成功,退出循环
      break
    }
    // 增加100ms间隔,避免频繁读取目录占用过高CPU,可根据灵敏度需求调整
    await new Promise(resolve => setTimeout(resolve, 100))
  }
}

调用说明

  • 入参1:要检测的目录绝对/相对路径
  • 入参2:要匹配的目标文件名(含后缀)
  • 入参3:可选超时时间,单位为毫秒,默认值为30秒
  • 匹配到目标文件后函数会正常返回,超时默认抛出错误,可根据自己的业务场景调整超时处理逻辑

内容的提问来源于stack exchange,提问作者amr kamel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 04:06:04