2.1.JavaScript异步流程控制-after函数+发布订阅

147 阅读1分钟

如何解决异步问题

  1. 回调函数 高阶函数 (函数中的参数是函数的话, 函数返回函数)
  2. promise 还是有回调
  3. generator 生成器(判读多,麻烦)
  4. async + await

after函数

可以限制到达多少次后执行此回调

function after(times,cb) {
  return function () {
    if(--times == 0){
      cb();
    }
  }
}
let fn = after(3,function () {
  console.log('完成了');
});
fn();
fn();
fn();

异步编程问题

  1. 异步没法捕获错误 异步代码不能try{}catch(e){}
  2. 异步编程中可能会出现回调地狱,异步回调嵌套会导致代码难以维护,而且不方便处理错误;
  3. 多个异步的操作,在同一个时间内容,同步异步的结果

1) 依赖after函数来实现异步操作

let fs = require('fs');
let schoolInfo = {}
function after(times,cb) {
  return function () {
    if (--times== 0){
      cb(schoolInfo);
    }
  }
}
let fn = after(2,function (data) {
  console.log(data);
});
fs.readFile('./name.txt','utf8',function (err,data) {
  schoolInfo['name'] = data;
  fn();
});
fs.readFile('./age.txt', 'utf8', function (err, data) {
  schoolInfo['age'] = data;
  fn();
});

2) 通过发布订阅模式来实现

let fs = require('fs');
let schoolInfo = {}
let dep = {
  arr:[],
  emit(){
    this.arr.forEach(function (fn) {
      fn();
    })
  },
  on(fn){
    this.arr.push(fn);
  }
}
dep.on(function () {
  if (Object.keys(schoolInfo).length === 2){
    console.log(schoolInfo)
  }
});
dep.on(function () {
  console.log('哈哈')
})
fs.readFile('./name.txt','utf8',function (err,data) {
  schoolInfo['name'] = data;
  dep.emit();
});
fs.readFile('./age.txt', 'utf8', function (err, data) {
  schoolInfo['age'] = data;
  dep.emit();
});