Promise如何解决回调地狱
作者:互联网
什么是回调地狱?
- 说到回调地狱 想到的是异步 在JavaScript中我们经常会大量使用异步回调,比如使用Ajax请求数据,回调地狱是由于糟糕的编码习惯造成的,功能逻辑代码嵌套的层次太多,导致可读性降低,维护性困难,避免回调地狱的最重要的方面是将功能移开,保持代码简单,不嵌套并分成小模块,也就是多多进行代码封装。
(函数作为参数层层嵌套)
getFileByPath(path.join(__dirname, './files/1.txt'), function (data) {
console.log(data);
getFileByPath(path.join(__dirname, './files/2.txt'), function (data) {
console.log(data);
getFileByPath(path.join(__dirname, './files/3.txt'), function (data) {
console.log(data);
});
});
});
关于promise:
-
Promise 是异步编程的一种解决方案:从语法上讲,promise是一个对象,从它可以获取异步操作的消息;从本意上讲,它是承诺,承诺它过一段时间会给你一个结果。promise有三种状态:pending(等待态),fulfiled(成功态),rejected(失败态);状态一旦改变,就不会再变。创造promise实例后,它会立即执行。
-
一般来说我们会碰到的回调嵌套都不会很多,一般就一到两级,但是某些情况下,回调嵌套很多时,代码就会非常繁琐,会给我们程序员带来很多麻烦,简称:回调地狱。
使用ES6的promise解决回调地狱:
//创建一个Promise实例,获取数据。并把数据传递给处理函数resolve和reject。需要注意的是Promise在声明的时候就执行了。
var getUserInfo=new Promise(function(resolve,reject){
$.ajax({
type:"get",
url:"index.aspx",
success:function(data){
if(data.Status=="1"){
resolve(data.ResultJson)//在异步操作成功时调用
}else{
reject(data.ErrMsg);//在异步操作失败时调用
}
}
});
})
//另一个ajax Promise对象,
var getDataList=new Promise(function(resolve,reject){
$.ajax({
type:"get",
url:"index.aspx",
success:function(data){
if(data.Status=="1"){
resolve(data.ResultJson)//在异步操作成功时调用
}else{
reject(data.ErrMsg);//在异步操作失败时调用
}
}
});
})
//Promise的方法then,catch方法
getUserInfo.then(function(ResultJson){
//通过拿到的数据渲染页面
}).catch(function(ErrMsg){
//获取数据失败时的处理逻辑
})
//Promise的all方法,等数组中的所有promise对象都完成执行
Promise.all([getUserInfo,getDataList]).then(function([ResultJson1,ResultJson2]){
//这里写等这两个ajax都成功返回数据才执行的业务逻辑
})
标签:function,异步,地狱,Promise,promise,回调,data 来源: https://blog.csdn.net/weixin_49684597/article/details/114988023