如果我们遇到一个回调函数必须依赖另一个回调函数执行调用,那么这个函数是异步执行的。 最典型的是在前端开发中的ajax请求,服务器的响应返回的过程就是异步的,如果有许多功能需要连续调用的时候,代码就要层层嵌套,这就会形成回调地狱。
如何解决回调地狱,以下有两种解决方法
一、将回调里面的的功能封装为函数,减少代码重复率(缺少通用性)
二、使用ES6中的promise
const preA = new Promise(resolve => {
let params = {
type: "list",
ids: idArray.slice(0,90).join(",")
}
API.fetchSpecialMomentList(params, (code, data) =>{
resolve(data);
})
});
// 获取行情的当前价接口
const preB = new Promise(resolve => {
let params = {
type: "list",
ids: idArray.slice(90,180).join(",")
}
API.fetchSpecialMomentList(params, (code, data) =>{
resolve(data);
})
});
Promise.all([preA, preB]).then(([dataA, dataB]) => {
// A接口和B接口信息都返回后,进行下面的功能
let scrollParams = {
dataList: this.newMomentList.concat(dataA.concat(dataB)),
scrollType: 'refresh'
}
this.$refs.scroller.getData(scrollParams)
this.allMomentList = this.newMomentList.concat(dataA.concat(dataB))
this.loadingActive = false
})
三、使用ES7中的async/await解决
function after2seconds() {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve('2秒后返回值')
}, 2000);
} )
}
function after3seconds() {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve('3秒后返回值')
}, 3000);
} )
}
async function awaitTest() {
let result = await after2seconds()
let result2 = await after3seconds()
console.log('异步变同步', result, result2);
}
awaitTest()
Promise相关的两个方法只能在异步函数之间没有相互依赖关系时使用,若异步函数之间有依赖关系,可以使用promise的then和catch
var promise1 = new Promise((resolve, reject) => {
setTimeout(() => {
console.log("A先走")
resolve('A完成')
}, 2000);
})
var promise2 = promise1.then(function(data){
console.log("A完成", data)
})
return promise2