waiaan
V2EX  ›  Node.js

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

  •  
  •   waiaan · Jan 17, 2018 · 4966 views
    This topic created in 3039 days ago, the information mentioned may be changed or developed.

    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 replies    2018-01-18 10:30:44 +08:00
    woodensail
        1
    woodensail  
       Jan 17, 2018
    在没有 promise 的时代,一般都是靠 callback 的。至于你这种情况就得递归了。
    waiaan
        2
    waiaan  
    OP
       Jan 17, 2018
    @woodensail
    能否给个这种用递归的例子,谢谢。
    guiguan
        3
    guiguan  
       Jan 17, 2018
    你可以用 readdirSync。但出于效率考虑,还是推荐用 promise 或者 async/await
    mdluo
        4
    mdluo  
       Jan 17, 2018
    把 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  
       Jan 17, 2018
    以上只是基于你提供的代码的功能,只读取一层,如果想做递归遍历文件目录,直接用 https://github.com/isaacs/node-glob
    ChefIsAwesome
        6
    ChefIsAwesome  
       Jan 17, 2018
    http://jsbin.com/jotarociwa/edit?html,js,console,output
    就是递归,你感受一下异步和同步的区别。
    waiaan
        7
    waiaan  
    OP
       Jan 18, 2018
    @mdluo
    谢谢,请问怎么让取到的 datas 的值能在第一个 readdir 外面用到?
    mdluo
        8
    mdluo  
       Jan 18, 2018 via iPhone
    @waiaan 包装成函数,return 就行了
    mdluo
        9
    mdluo  
       Jan 18, 2018 via iPhone
    @waiaan 不对,是包装成函数,函数参数里有一个对外的 callback,console.log 的地方调用这个 callback
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   5555 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 37ms · UTC 07:19 · PVG 15:19 · LAX 00:19 · JFK 03:19
    ♥ Do have faith in what you're doing.