背景与动机
在前端开发中,Promise 是处理异步操作的重要工具。它通过将异步操作封装在 Promise 实例中,解决了传统回调地狱的问题,提高了代码的可读性和可维护性。虽然 Promise 的概念源于前端,但在 C++11 标准中也引入了 std::promise,用于实现类似的功能。
不过,std::promise 的链式调用体验并不如前端原生 Promise 那样直观。为了深入理解异步状态机的工作原理,我们尝试用 C++11 手写一个支持链式调用的 Promise 实现(下文称为 CPromise),并与标准库进行对比。
为什么需要 Promise
解决回调地狱
传统的嵌套回调让代码难以阅读和维护。Promise 通过链式调用,将异步逻辑线性化。
function timeout(ms) {
return new Promise((resolve) => {
setTimeout(resolve, ms);
});
}
timeout(1000).then(() => {
console.log('1 秒后执行');
});
统一错误处理
Promise 提供了统一的错误处理机制,通过 catch 方法可以集中处理所有异步操作中的错误。
fetch('https://api.example.com/data')
.then(response => response.json())
.then(data => {
console.log('获取到数据:', data);
})
.catch(error => {
console.error('请求失败:', error);
});
并发控制
通过 Promise.all 和 Promise.race,可以方便地控制多个异步操作的执行顺序和结果。


