最近比较郁闷,和朋友聊着聊着就聊到了掉头发的事件(-_-!),程序员还是要好好保护自己啊,下面进入正题:
从文件读写的例子讲起
刚学习Node的同学,多会敲一个读取文件的代码:
fs.readFile(path.join(__dirname,'/db.json'), 'utf-8', function (err, data) {
if (err) {
console.log('read error');
return;
}
console.log(data);
});
在控制台运行一下,很完美。
突然来了个需要,要求先读取A,再读取B.新手一般多会这样写:
fs.readFile(path.join(__dirname,'/db.json'),'utf-8', function (err, data) {
if (err) {
console.log('read error');
return;
}
console.log(data);
fs.readFile(path.join(__dirname, '/message.json'), 'utf-8', function (err, data) {
if (err) {
console.log('read error');
return;
}
console.log(data);
});
});
恭喜你进入了回调地狱,当条件限制特别多的时候,你就看到无数个}}}}}}}}}}}
ES2015 Promise
如果你用过Angular 你应该会很了解promise($q服务)
这里我简单的介绍一下,下面会贴上好的解答的连接。
ES2015中加入了Promie:
Promise只有两种状态:成功或者失败
1、pending --> resolve 未完成到成功
2、pending --> reject 未完成到失败
Promise的缺点:
1、无法取消Promise,一旦建立立即执行。
2、不设置回调函数,不会将状态反应到外部。
这里我们会用到then(successCallback,errorCallback) 和 catch(callback) 这两个方法。
function step1(resolve, reject) {
fs.readFile(path.join(__dirname, '/db.json'), 'utf-8', function (err, data) {
if (err) {
reject("step1 error");
return;
}
resolve(data);
});
}
function step2(resolve, reject) {
fs.readFile(path.join(__dirname, '/message.json'), 'utf-8', function (err, data) {
if (err) {
reject('step2 error');
return;
}
resolve(data);
})
}
new Promise(step1).then(function (response) {
console.log(response);
// 执行第二步
return new Promise(step2);
}).then(function (response) {
console.log(response);
}).catch(function (error) {
console.log(error);
});
是不是很好的处理各个流程的回调方法,再也不用被该死的}}}}的困扰了。
Generator与Promise的结合 co库
在这之前你需要了解一下ES6的Generator(放心,资料的链接我多放在底部了*_*)
这里我要给大家安利一下co库
来看一下这个优雅的实现
(step1 和 step2为上面的声明的函数。。)
co(function * () {
var result = yield new Promise(step1);
var result1 = yield new Promise(step2);
return {
"step1": result,
"step2": result1
}
}).then(function (response) {
//成功回调
console.log(response);
}).catch(function (error) {
//错误回调
console.log(error);
});
可能看到这里,萌新会一投雾水,下面已经准备好传送门。
看完你可以,再回来看看这篇文章。