我们经常在使用ajax,或者读写文件(fs.readFile、fs.writeFile)的时候都不是一瞬间执行的操作,所以不管是浏览器还是后台Node在解析运行代码的时候,都会依次性执行,而其间由于上述操作需要时间,但是他们又不像js文件的引用一样有阻断代码执行的状况,所以当它们在执行的时候,只要ajax及读取文件的代码后面还有别的代码要运行,很可能因为ajax和读写文件的代码执行需要一段时间,反而他们后面的代码先于他们执行完毕,所以这样就会产生了异步的情况,因此我们将ajax以及读写文件理解为异步操作;可是往往我们又需要对异步的结果进行操作( 比如:用数据去渲染模板),所以我们不得不在异步操作的代码里面放入一个回调函数,等待异步代码执行完后,我们在用回调函数去操作异步代码获取的结果,那么就发生了代码的嵌套;
这种嵌套其实也只有一层,可能根本算不上嵌套,但是在很多时候,我们都需要上述异步代码的结果再去异步获取另一个结果,然后再根据上一层异步结果再去获取另一个结果,如果需要获取3次数据结果,那么就得再嵌套两次,可是在大项目中,5次、8次甚至更多都是会有的,那么我们就不得不一层层的去嵌套,这样多次的嵌套对程序员来说维护代码是非常不方便的,从可读性(人眼可读)来讲,都非常吃力,所以这个时候ES6的promise函数诞生了,他是专门结局这种嵌套的;
var fs = require('fs');
function Pget (pathname){
return new Promise(function (resoloved,rejected) {
fs.readFile(pathname, 'utf8', function (error, data) {
if (error) {
rejected(error);
} else {
resoloved(data);
}
});
});
}
Pget('./a.text')
.then(function (data) {
console.log(data);
return Pget('./b.text');
})
.then(function (data) {
console.log(data);
return Pget('./c.text')
})
.then(function (data) {
console.log(data);
});