大家都知道nodejs很快,为什么会这么快呢,原因就是node采用异步回调的方式来处理需要等待的事件,使得代码会继续往下执行不用在某个地方等待着。但是也有一个不好的地方,当我们有很多回调的时候,比如这个回调执行完需要去执行下个回调,然后接着再执行下个回调,这样就会造成层层嵌套,代码不清晰,很容易进入“回调监狱”,就容易造成下边的例子:
async(1, function(value){
async(value, function(value){
async(value, function(value){
async(value, function(value){
async(value, function(value){
async(value, final);
});
});
});
});
});
这样的写法会让人崩溃,那么有什么办法可以解决这个问题呢,或者有其他别的写法吗?答案是有的,es6新出的promise对象已经es7的async await都可以解决这个问题。 (1)我们接下来首先谈一谈promise,下面是定义一个promise对象
let a = 1;
let promise = new Promise(function(resolve, reject){
if(a==10){
resolve('成功了');
}else{
reject('失败了');
}
});
定义的promise对象接受成功和失败回调可以这样接收
promise.then(res=>{
console.log(res); //成功回调
},err=>{
console.log(err); //失败回调
})
也可以使用catch接收失败回调
promise.then(res=>{
console.log(res); //成功回调
}).catch(err=>{
console.log(err); //失败回调
})
下面是promise的一些api 1、Promise.resolve() 使用方法
let p1 = Promise.resolve('aaa');
p1.then(res=>{
console.log(res);
})
等同于
let p1 = new Promise(resolve =>{
resolve('aaa')
});
p1.then(res=>{
console.log(res);
})
2、Promise.reject() 3、Promise.all() // 所有的都有完成,相当于 且 4、Promise.race() // 完成一个即可,相当于 或
(2)接下来我们来看一个使用node来异步读取文件的实例来展示 1、使用promise来实现
const fs = require('fs');
//简单封装 fs封装成一个promise
const readFile = function (fileName){
return new Promise((resolve, reject) =>{
fs.readFile(fileName, (err, data) =>{
if(err) reject(err);
resolve(data);
});
});
}
//promise
readFile('data/a.txt').then(res=>{
console.log(res.toString());
return readFile('data/b.txt');
}).then(res=>{
console.log(res.toString());
return readFile('data/c.txt');
}).then(res=>{
console.log(res.toString());
})
2、使用generator来实现
const fs = require('fs');
//简单封装 fs封装成一个promise
const readFile = function (fileName){
return new Promise((resolve, reject) =>{
fs.readFile(fileName, (err, data) =>{
if(err) reject(err);
resolve(data);
});
});
}
//generator
function * gen(){
yield readFile('data/a.txt');
yield readFile('data/b.txt');
yield readFile('data/c.txt');
}
let g1 = gen();
g1.next().value.then(res=>{
console.log(res.toString());
return g1.next().value;
}).then(res=>{
console.log(res.toString());
return g1.next().value;
}).then(res=>{
console.log(res.toString());
})
看起来优雅了不少 3、使用async来实现
const fs = require('fs');
//简单封装 fs封装成一个promise
const readFile = function (fileName){
return new Promise((resolve, reject) =>{
fs.readFile(fileName, (err, data) =>{
if(err) reject(err);
resolve(data);
});
});
}
//async
async function fn(){
let f1 = await readFile('data/a.txt');
console.log(f1.toString());
let f2 = await readFile('data/b.txt');
console.log(f2.toString());
let f3 = await readFile('data/c.txt');
console.log(f3.toString());
}
fn();
以上就是一些简单的理解和学习记录。