对回调地狱和Promise理解
1.什么是回调地狱,为什么要用回调地狱
fs.readFile('./a.txt',"UTF-8",function(err,data){
if(err){
throw err;
}
console.log(data)
})
fs.readFile('./b.txt',"UTF-8",function(err,data){
if(err){
throw err;
}
console.log(data)
})
fs.readFile('./c.txt',"UTF-8",function(err,data){
if(err){
throw err;
}
console.log(data)
})
像这样异步请求的代码,无法保证请求结果返回的先后顺序,每一次结果的顺序都可能不同,
因此若想要异步请求能够按照指定的顺序将结果返回,则就需要用回调嵌套
的方式来编写代码 ->即:回调地狱
fs.readFile('./a.txt',"UTF-8",function(err,data){
if(err){
throw err;
}
console.log(data)
fs.readFile('./b.txt',"UTF-8",function(err,data){
if(err){
throw err;
}
console.log(data)
fs.readFile('./c.txt',"UTF-8",function(err,data){
if(err){
throw err;
}
console.log(data)
})
})
})
以上编码方式虽然可以解决异步请求结果返回先后的顺序问题,但请求嵌套得越深越不方便代码的阅读,所以ECMAScript6中新增了一个API:Promise
。
- Promise的直译是承诺、保证(I promise you)
var p = new Promise(function(resolve, reject){
//做一些异步操作
setTimeout(function(){
console.log('执行完成');
resolve('随便什么数据');
}, 2000);
});
Promise的构造函数接收一个参数,是函数,并且传入两个参数:resolve
,reject
,分别表示异步操作执行成功后的回调函数
和异步操作执行失败后的回调函数
。其实这里用“成功”和“失败”来描述并不准确,按照标准来讲,resolve是将Promise的状态置为fullfiled,reject是将Promise的状态置为rejected。
附赠阅读:
promise详细解读,
大白话说promise