nodejs之generator,promise和async

promise:是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大。

https://blog.csdn.net/swimming_in_IT_/article/details/78350126

generator: 函数是 ES6 提供的一种异步编程解决方案,语法行为与传统函数完全不同。

http://es6.ruanyifeng.com/#docs/generator

async:是 Generator 函数的语法糖。我不知道语法糖是什么,但是我知道aync的替代品,而且比generator好用多了。

https://blog.csdn.net/swimming_in_IT_/article/details/78351584

下面举个异步读取文件的例子看看上面三种方式是如何处理异步的。用户需要对上述例子有一定的了解。在node中,读取文件的模块是 fs,分为同步读取和异步读取。

const fs = require('fs');

// 同步读取文件
let buf = fs.readFileSync('content.js');

// 异步读取文件
fs.readFile('content.js', (err, data) => {
    if (err) {
        console.log('读取文件失败'+err);
    } else {
        console.log(data);
    }
});


JavaScript 在发展过程中,共经历了回调函数Promise 对象Generator 函数async 函数来处理异步。我们接下来就来看一下 async 函数如何更优雅的处理异步。假设我们需要分别读取 a、b、c 三个文件,具体代码如下:

封装promise

const fs = require('fs')

const readFile = function (src) {
    return new Promise((resolve, reject) => {
        fs.readFile(src, (err, data) => {
            if (err) reject(err);
            resolve(data);
        });
    });
};

promise写法:

readFile('content.js').then(data => {
    console.log(data.toString());
    return readFile('content2.js');
}).then(data => {
    console.log(data.toString());
}).catch(err => console.log(err))

generator写法:

//generator写法
function* ascReadFile() {
    yield readFile('content.js');
    yield readFile('content2.js')
}
let run = ascReadFile();
g.next().value.then(data => {
    console.log(data.toString());
    return run.next().value;
}).then(data => {
    console.log(data.toString());
    return run.next().value;   
}).catch(err => console.log(err))

async写法:

//async
async function asyncReadFile(){
    let a = await readFile('content.js');
    console.log(a.toString());

    let b = await readFile('content2.js');
    console.log(b.toString());
}

asyncReadFile();

以前自己在处理异步操作的时候,当时就是使用的回调,到后来了解到promise后,都是使用promise的链式写法来解决回调地狱,到后来就接触到了async/await来处理异步。因为generator被async替代了,一直没有了解到这个知识的语法。现在回过头来看generator被async替代了,太正常了,毕竟我发现,有了async我再也不想用generator了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值