node环境下遍历文件夹时怎么做到每次输出前间隔一秒?

发布于 2022-09-13 00:03:09 字数 686 浏览 12 评论 0

node环境下,我有一个包含图片的文件夹,下面还有子文件夹。我的目标是从根文件夹遍历,每遇到一个文件,输出文件名,然后停顿一秒,再遍历输出下一个文件。

我想到的方法是利用generator函数遍历文件,然后setInterval()每隔一秒手动触发interator的next。设想的代码如下:

const fs = require('fs')
const path = require('path')

function* walk(f) {
    let stats = fs.statSync(f)
    if (stats.isFile()) {
        yield f
    } else if (stats.isDirectory()) {
        fs.readdirSync(f)
            .map(x => path.resolve(f, x))
            .forEach(x => walk(x))
    }
}

let it = walk('d:\\图片')

setInterval(function () {
    let imgName = it.next().value
    console.log(imgName)
}, 1000)

但是,这段代码只能用来遍历一层的文件夹。当递归调用时,这样就会报错。后面就不知道该怎么写了。

是不是应该用async/await写啊?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

不管是yield 还是 promise 还是 async/await 都可以实现
如果使用 yield 可以参考下面的代码

const fs = require("fs");
const path = require("path");

function* walk(f) {
    let stats = fs.statSync(f);
    if (stats.isFile()) {
        yield f;
    } else if (stats.isDirectory()) {
        const files = fs.readdirSync(f).map((x) => path.resolve(f, x));
        for (const file of files) {
            yield* walk(file);
        }
    }
}

let it = walk("d:\\图片");

const interval = setInterval(function () {
    let imgName = it.next().value;
    if (!imgName) {
        clearInterval(interval);
        return;
    }
    console.log(imgName);
}, 1000);
属性 2022-09-20 00:03:09

搞个输出节流就得了嘛。 不会写直接 https://www.lodashjs.com/docs...

image.png

fun = _.throttle(function(){
    console.log(Date.now())
    fun()
}, 1000, {leading:false})


fun();fun();fun();fun();
setTimeout(fun, 100);setTimeout(fun, 100);
setTimeout(fun, 200);setTimeout(fun, 300)
setTimeout(fun, 1100);setTimeout(fun, 1100);
setTimeout(fun, 1200);setTimeout(fun, 1300)


~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文