绝佳例子

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); }); }


- [Async functions - making promises friendly - Google Developers](https://developers.google.com/web/fundamentals/getting-started/primers/async-functions)

- [阮一峰 - Async](http://www.ruanyifeng.com/blog/2015/05/async.html) 称 async 是 generator 的语法糖。 但是本来都是语法糖,所以谁继承谁也都无所谓啦。

## Generator

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

- [阮一峰 - Generator](http://www.ruanyifeng.com/blog/2015/04/generator.html)