回调函数方式实现
function asyncOperationA(callback) {
setTimeout(() => {
callback('Result of A');
}, 1000);
}
function asyncOperationB(callback) {
setTimeout(() => {
callback('Result of B');
}, 1000);
}
function asyncOperationC(callback) {
setTimeout(() => {
callback('Result of C');
}, 1000);
}
asyncOperationA((resultA) => {
console.log(resultA);
asyncOperationB((resultB) => {
console.log(resultB);
asyncOperationC((resultC) => {
console.log(resultC);
});
});
});
回调地狱的原因
- 嵌套过深:随着异步操作的增多,回调函数会层层嵌套,代码变得越来越难以阅读和维护。例如上述代码如果有更多异步操作需要依次执行,嵌套会更深。
- 错误处理复杂:在嵌套的回调中,错误处理变得繁琐,每个回调函数都需要单独处理错误,难以统一管理。
Promise重构
function asyncOperationA() {
return new Promise((resolve) => {
setTimeout(() => {
resolve('Result of A');
}, 1000);
});
}
function asyncOperationB() {
return new Promise((resolve) => {
setTimeout(() => {
resolve('Result of B');
}, 1000);
});
}
function asyncOperationC() {
return new Promise((resolve) => {
setTimeout(() => {
resolve('Result of C');
}, 1000);
});
}
asyncOperationA()
.then(resultA => {
console.log(resultA);
return asyncOperationB();
})
.then(resultB => {
console.log(resultB);
return asyncOperationC();
})
.then(resultC => {
console.log(resultC);
});
Promise相较于回调函数的优势
- 代码可读性提高:通过
.then
链式调用,避免了回调函数的层层嵌套,使代码结构更加清晰,易于理解和维护。
- 统一的错误处理:可以通过
.catch
统一处理整个Promise链中的错误,而不需要在每个回调函数中单独处理,简化了错误处理逻辑。