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了。