nodejs4: 递归, async await

实现功能:打印wwwroot下所有的目录

注意如果按照普通逻辑写是不行的,因为在fs里面是异步的。

解决思路:1.改造for循环,递归实现 2.nodejs里面的新特性 async await

1 递归:匿名自执行函数

const fs = require('fs');
var path = './wwwroot';
var dirArr = [];

fs.readdir(path, (err, files) => {
    if (err) throw err;
    (function getDir(i) {
        if (i == files.length) {
            console.log(dirArr);
            return;
        }
        fs.stat(path + '/' + files[i], (err, stat) => {
            if (stat.isDirectory()) {
                dirArr.push(path + '/' + files[i]);
            }
            getDir(i + 1);
        })
    })(0)
})

love js,看到了统一性

2 Async Await Promise

Promise 为 ES6,Async Await 为 ES7

2.1 ES6 常见语法

ES6之前:通过回调函数来获取异步方法里面的数据。卧槽。

function getData(callback) {
    // ajax
    setTimeout(function() {
        var name = 'qer';
        callback(name);
    }, 1000);
}

getData((aaa) => {
    console.log(aaa);
})

ES6:Promise
resolve 是成功的回调函数,reject是失败的回调函数

var p = new Promise((resolve, reject) => {
    setTimeout(() => {
        var name = 'qer';
        resolve(name);
    }, 1000);
})
/*

将函数封装的写法:
function getData(resolve, reject) {
    setTimeout(() => {
        var name = 'qer';
        resolve(name);
    }, 1000);
}
var p = new Promise(getData);

*/

p.then((name) => {
    console.log(name);
})
2.2 Async Await

async 让方法变成异步;
await 等待异步方法执行完成。

async 将函数变成异步,这个函数的返回值将变成 Promise
await 必须用在异步方法里面,这时取出来的值不再是 Promise.

比较好理解的例子:
async function test() {
    return 'hello';
}

async function main() {
    var data = await test();
    console.log(data);
}

main();

async 与 Promise 结合:

async function test() {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            var name = 'qer';
            resolve(name);
        }, 1000);
    })
}

async function main() {
    var data = await test();
    console.log(data);
}

main();

解决和实现本文开头的问题:

const fs = require('fs');
const { dir } = require('console');

// 1、定义一个异步方法 isDir 来判断一个资源到底是目录还是文件

async function isDir(path) {
    return new Promise((resolve, reject) => {
        fs.stat(path, (err, stat) => {
            if (err) throw err;
            if (stat.isDirectory()) {
                resolve(true);
            } else {
                resolve(false);
            }
        })
    })
}

// 2、获取 wwwroot 里面的所有资源 循环遍历

function main() {
    var path = '../05 fs/wwwroot';
    var dirArray = [];
    fs.readdir(path, async (err, files) => { // 此处异步
        if (err) throw err;
        for (var i = 0; i < files.length; i++) {
            if (await isDir(path + '/' + files[i])) {
                dirArray.push(files[i]);
            }
        }
        console.log(dirArray);
    })
}

main();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>