Diff Promise Generator Async

绝佳例子

var fs = require('fs');
// callback 写法
fs.readFile('/etc/fstab', function (err, f1) {
if (err) throw err;
console.log(f1.toString());
fs.readFile('/etc/shells', function (err, f2) {
if (err) throw err;
console.log(f2.toString());
}
});
// 出现了两层嵌套。如果有更多文件的话,将会有更多嵌套

var readFile = function (fileName){
return new Promise(function (resolve, reject){
fs.readFile(fileName, function(error, data){
if (error) reject(error);
resolve(data);
});
});
};
// Promise 写法
readFile(fileA)
.then(function(data){
console.log(data.toString());
})
.then(function(){
return readFile(fileB);
})
.then(function(data){
console.log(data.toString());
})
.catch(function(err) {
console.log(err);
});

// generator 写法
var gen = function* (){
var f1 = yield readFile('/etc/fstab');
console.log(f1.toString());
var f2 = yield readFile('/etc/shells');
console.log(f2.toString());
};

// async 写法
var asyncReadFile = async function (){
var f1 = await readFile('/etc/fstab');
console.log(f1.toString());
var f2 = await readFile('/etc/shells');
console.log(f2.toString());
};
var f1 = await readFile('/etc/fstab');
// ===
readFile('/etc/fstab')
.then((data) => {
var f1 = data;
})

参考 阮一峰 - Generator阮一峰 - Async

Promise

Promise 是 callback 的语法糖。流式写法的 callback 。最基本的功能,用另一种方式写 callback 。再加上了 .then 提供的异步操作队列。但是本质上依然是 callback 而已。只是写法上的不同,并没有新的线程管理,任务管理机制的引入。

Promise 是一个对象,从它可以获取异步操作的消息。Promise 提供统一的 API,各种异步操作都可以用同样的方法进行处理。

Async

而 Async 又是 Promise 的语法糖。将 Promise 中的 .then 函数删掉, 直接将 .then 函数要执行的直接写就可以。 await 之后就是 .then() 里的内容。但是看起来和同步函数完全一样。而且支持把错误处理用原生 try{} catch{} 方式去处理。如此重新把在 Promise 中被代替的 catch 错误处理方式用起来。但是其实也可以支持 Promise 的 .catch ,效果一样:

async function myFunction() {
try {
await somethingThatReturnsAPromise();
} catch (err) {
console.log(err);
}
}

// 另一种写法
async function myFunction() {
await somethingThatReturnsAPromise().catch(function (err){
console.log(err);
});
}

Generator

是另一个 Promise 的语法糖。 yield 类似 await 的意义。但是提供了 next() 作为控制异步流程的方法。 更像一个子线程一样的行为。但是其实只是看起来像一个子线程。本质还是用 callback 进行切换。并没有某种任务管理器来自动根据需求切换线程。