ES6:通过实现读文件功能理解Promise、Generator函数、async函数区别

1、Promise

const fs = require('fs');
//nodejs的内置模块,由于读取文件一般是由异步执行,这样不会阻塞别的功能代码执行
//把fs封装成一个Promise对象,然后在下面返回数据输出
const read = function(fileName) {
    return new Promise((resolve ,reject ) => {
        fs.readFile(fileName , (err,data) => {//异步。readFileSync(同步,阻塞下面代码执行)
            if (err) {
                reject(err);
            } else {
                resolve(data);
            }
        })
    });
}
read("1.txt").then( res => {
    console.log(res.toString());
    return read("2.txt");
})
.then( res => {
    console.log(res.toString());
})
console.log('end') 
end
我是第一个文本。
我是第二个文本。

 注:由于promise异步函数,所以当执行时end会比文本内容优先输出。

2、Generator函数

const fs = require('fs');
//nodejs的内置模块,由于读取文件一般是由异步执行,这样不会阻塞别的功能代码执行
//把fs封装成一个Promise对象,然后在下面返回数据输出
const read = function(fileName) {
    return new Promise((resolve ,reject ) => {
        fs.readFile(fileName , (err,data) => {//异步。readFileSync(同步,阻塞下面代码执行)
            if (err) {
                reject(err);
            } else {
                resolve(data);
            }
        })
    });
}
function * show(){
    yield read("1.txt");
    yield read("2.txt");
    yield read("3.txt");
}
const s = show();

s.next().value
.then( res => {
    console.log('1 ' + res.toString());
    return s.next().value;
})
.then( res => {
    console.log('2 ' + res.toString());
    return s.next().value;
})
.then( res => {
    console.log('3 ' + res.toString());
})
1 我是第一个文本。
2 我是第二个文本。
3 我是第三个文本。

 注:这里很明显generstor将所有read文件的命令抽出形成一个函数调用,但是由于yield使生成器函数执行暂停,yield关键字后面的表达式的值返回给生成器的调用者。它可以被认为是一个基于生成器的版本的return关键字。

于是与promise有了同样的效果。

但是,这样写依旧比较繁琐,就有了async的方法。

3、async函数

const fs = require('fs');
//nodejs的内置模块,由于读取文件一般是由异步执行,这样不会阻塞别的功能代码执行
//把fs封装成一个Promise对象,然后在下面返回数据输出
const read = function(fileName) {
    return new Promise((resolve ,reject ) => {
        fs.readFile(fileName , (err,data) => {//异步。readFileSync(同步,阻塞下面代码执行)
            if (err) {
                reject(err);
            } else {
                resolve(data);
            }
        })
    });
}
//async就代表异步,里面有个await(只能在async函数中使用)搭配使用
//每到await的地方就是程序需要等待执行后面的程序,语义化很强
async function readByAsync(){
    const a1 = await read('1.txt');
    const a2 = await read('2.txt');
    const a3 = await read('3.txt');
    console.log(a1.toString());
    console.log(a2.toString());
    console.log(a3.toString());
}
readByAsync();
我是第一个文本。
我是第二个文本。
我是第三个文本。

 注:这里async将读操作,输出操作集成到一道函数中,省去了generstor函数中的then()调用,更加方便。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PromiseGenerator 函数Async 函数都是 JavaScript 用于处理异步编程的工具。 PromiseES6 引入的一种异步编程解决方案,通过 Promise 对象可以更方便地进行异步操作的管理和流程控制。Promise 对象有三种状态:pending(等待)、fulfilled(已成功)和 rejected(已失败),可以通过 then 方法来注册回调函数,处理 Promise 对象的状态变化。 下面是一个使用 Promise 的示例: ```javascript function fetchData() { return new Promise((resolve, reject) => { // 异步操作 setTimeout(() => { const data = { name: 'John', age: 30 }; if (data) { resolve(data); // 成功回调 } else { reject(new Error('fetch data error')); // 失败回调 } }, 1000); }); } fetchData().then(data => { console.log(data); // 输出 { name: 'John', age: 30 } }).catch(error => { console.error(error); }); ``` Generator 函数ES6 引入的一种特殊的函数,可以通过 yield 语句来控制函数的执行流程。Generator 函数的执行结果是一个迭代器对象,可以通过 next 方法来控制 Generator 函数的执行。Generator 函数可以用于异步编程,通过 yield 语句来暂停函数的执行,等待异步操作完成后再继续执行。 下面是一个使用 Generator 函数的示例: ```javascript function* fetchData() { const data = yield new Promise((resolve, reject) => { // 异步操作 setTimeout(() => { const data = { name: 'John', age: 30 }; if (data) { resolve(data); // 成功回调 } else { reject(new Error('fetch data error')); // 失败回调 } }, 1000); }); console.log(data); // 输出 { name: 'John', age: 30 } } const iterator = fetchData(); const promise = iterator.next().value; promise.then(data => { iterator.next(data); }).catch(error => { console.error(error); }); ``` Async 函数是 ES7 引入的一种新的异步编程解决方案,是 Generator 函数的语法糖。Async 函数可以让异步操作的代码看起来像同步操作的代码,使用起来更加简单明了。Async 函数的执行结果是一个 Promise 对象,可以通过 then 方法来注册回调函数。 下面是一个使用 Async 函数的示例: ```javascript async function fetchData() { try { const data = await new Promise((resolve, reject) => { // 异步操作 setTimeout(() => { const data = { name: 'John', age: 30 }; if (data) { resolve(data); // 成功回调 } else { reject(new Error('fetch data error')); // 失败回调 } }, 1000); }); console.log(data); // 输出 { name: 'John', age: 30 } } catch (error) { console.error(error); } } fetchData(); ``` 这三种工具的使用方式和语法不同,PromiseAsync 函数都是基于回调的方式处理异步操作,而 Generator 函数则是通过 yield 语句来控制异步操作的执行流程。Async 函数相比 PromiseGenerator 函数更加简单明了,可以让异步操作的代码看起来更像同步操作的代码。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值