V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
waiaan
V2EX  ›  Node.js

请教一个 nodejs 循环和异步的问题

  •  
  •   waiaan · 2018-01-17 18:59:05 +08:00 · 4349 次点击
    这是一个创建于 2262 天前的主题,其中的信息可能已经有所发展或是发生改变。

    let datas = []; fs.readdir(path, function(err, data) { for (let i = 0; i < data.length; i++) { fs.readdir(data[i].path, (err, lists) => { datas.push(lists); }); } }); console.log(datas);

    如何让 datas 取到期望的值? 不用 promise 等模块。 谢谢。

    9 条回复    2018-01-18 10:30:44 +08:00
    woodensail
        1
    woodensail  
       2018-01-17 19:03:07 +08:00
    在没有 promise 的时代,一般都是靠 callback 的。至于你这种情况就得递归了。
    waiaan
        2
    waiaan  
    OP
       2018-01-17 19:08:10 +08:00
    @woodensail
    能否给个这种用递归的例子,谢谢。
    guiguan
        3
    guiguan  
       2018-01-17 19:10:52 +08:00
    你可以用 readdirSync。但出于效率考虑,还是推荐用 promise 或者 async/await
    mdluo
        4
    mdluo  
       2018-01-17 20:18:29 +08:00
    把 readdir 的 callback 写到外面,加判断条件即可

    ```
    let datas = [];

    fs.readdir(path, function(err, data) {
    const callback = (err, lists) => {
    datas.push(lists);
    if (datas.length === data.length) {
    console.log(datas);
    }
    }
    for (let i = 0; i < data.length; i++) {
    fs.readdir(data[i], callback);
    }
    });

    ```
    mdluo
        5
    mdluo  
       2018-01-17 20:27:19 +08:00
    以上只是基于你提供的代码的功能,只读取一层,如果想做递归遍历文件目录,直接用 https://github.com/isaacs/node-glob
    ChefIsAwesome
        6
    ChefIsAwesome  
       2018-01-17 21:05:07 +08:00
    http://jsbin.com/jotarociwa/edit?html,js,console,output
    就是递归,你感受一下异步和同步的区别。
    waiaan
        7
    waiaan  
    OP
       2018-01-18 08:43:48 +08:00
    @mdluo
    谢谢,请问怎么让取到的 datas 的值能在第一个 readdir 外面用到?
    mdluo
        8
    mdluo  
       2018-01-18 10:29:01 +08:00 via iPhone
    @waiaan 包装成函数,return 就行了
    mdluo
        9
    mdluo  
       2018-01-18 10:30:44 +08:00 via iPhone
    @waiaan 不对,是包装成函数,函数参数里有一个对外的 callback,console.log 的地方调用这个 callback
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5324 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 05:54 · PVG 13:54 · LAX 22:54 · JFK 01:54
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.