如何解决异步问题
- 回调函数 高阶函数 (函数中的参数是函数的话, 函数返回函数)
- promise 还是有回调
- generator 生成器(判读多,麻烦)
- async + await
after函数
可以限制到达多少次后执行此回调
function after(times,cb) {
return function () {
if(--times == 0){
cb();
}
}
}
let fn = after(3,function () {
console.log('完成了');
});
fn();
fn();
fn();
异步编程问题
- 异步没法捕获错误 异步代码不能try{}catch(e){}
- 异步编程中可能会出现回调地狱,异步回调嵌套会导致代码难以维护,而且不方便处理错误;
- 多个异步的操作,在同一个时间内容,同步异步的结果
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();
});