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

JavaScript实现每次写入后端存储前等待1秒的问题求助

问题分析

你的代码里有两个核心问题导致等待逻辑失效:

  • forEach 不会等待内部的异步函数执行完成,所有的 await wait(1000) 会几乎同时触发,相当于所有等待操作一起开始,达不到逐个间隔1秒的效果。
  • 回调式的 fs.readdir 和 fs.stat 无法和 async/await 正确配合,异步流程的顺序被打乱。
修复方案

改用 fs/promises 模块的Promise版本方法,并用 for...of 循环替代 forEach,就能按顺序控制每个操作的等待逻辑:

// 引入Promise版本的fs模块
const fs = require('fs/promises');
const path = require('path');

const wait = (n) => new Promise((resolve) => setTimeout(resolve, n));

async function writeDescriptions(folderPath) {
    try {
        // 用Promise版readdir获取文件列表
        const files = await fs.readdir(folderPath);
        
        // for...of会等待每次循环的异步操作完成后再进入下一次
        for (const file of files) {
            const filePath = path.join(folderPath, file);
            
            // 用Promise版stat获取文件状态
            const stats = await fs.stat(filePath);
            
            if (stats.isFile()) {
                // 等待1秒后执行写入
                await wait(1000);
                
                if (opisRegex.test(file)) {
                    writeFileToStorage('short_description/', file.slice(0, -7) + '.txt', filePath);
                } else {
                    writeFileToStorage('pictures/', file + '.jpg', filePath);
                }
            }
        }
    } catch (err) {
        console.error('操作出错:', err);
    }
}
关键改动说明
  1. 替换回调式FS方法:fs/promises 的方法返回Promise,配合 await 可以让异步代码像同步代码一样按顺序执行,避免回调嵌套导致的流程混乱。
  2. 用for...of替代forEach:forEach 会直接遍历所有元素,不会等待内部异步操作;而 for...of 会严格等待当前循环的所有异步步骤完成后,才处理下一个文件,确保每次写入前都能等待1秒。
  3. 统一错误捕获:用 try/catch 包裹所有异步操作,简化错误处理逻辑,避免分散的回调错误处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 16:43:14