异步
JS 异步编程的方法
- 回调函数
- 事件监听
- 发布/订阅
- Promise
- Generator
- 
    async/await 
1.什么是异步
一个任务分成两段,先执行一段,然后转而执行其他任务,等做好准备,再回过头执行第二段

这种不连续的执行,叫做异步。
相应地,连续执行的叫做同步
回调函数
回调函数把任务的第二段单独写在一个函数里面,等到重新执行这个任务的时候,直接调用这个函数
fs.readFile("/etc/passwd", function (err, data) {
  if (err) throw err;
  console.log(data);
});
分离回调
jquery 的 ajax 是典型的分离回调
$.ajax({}, success, error);
function success(data) {
  console.log(data);
}
function error(err) {
  console.error(err);
}
first error
NodeJS 采用的是 first error,所有系统异步接口第一个参数都是 error 对象
function callback(err, data) {
  if (err) {
    // 出错
    return;
  }
  // 成功
  console.log(data);
}
async("url", callback);
- 问:为什么 NodeJS 约定,回调函数的第一个参数必须是错误对象 err(如果没有错误,返回该参数 null)
- 答:执行时分成两段,在两段之间抛出错误,程序无法捕获,只能当作参数,传入第二段
回调函数的罪状
- 回调地狱
- 并发执行
- 信任问题
参见