Promise

4 分钟
32 阅读
Promise

Promise:JavaScript 异步编程的核心范式

一、Promise 基础概念

1. 产生背景与核心价值

Promise 是 ES6 引入的异步编程解决方案,解决了传统回调地狱(Callback Hell)问题。其核心价值体现在:

  • 状态可管理性:提供明确的 pending / fulfilled / rejected 状态流转
  • 链式调用机制:通过 .then() 方法实现流程串联
  • 错误集中处理:通过 .catch() 统一捕获异常

2. 基本语法结构

typescript 复制代码
const promise = new Promise<T>((resolve, reject) => {
  // 异步操作(如 API 请求、定时器等)
  if (success) {
    resolve(value); // 状态变更为 fulfilled
  } else {
    reject(reason); // 状态变更为 rejected
  }
});

3. 生命周期方法

方法 作用描述 链式调用特性
.then() 处理 fulfilled 状态结果 可返回新 Promise
.catch() 处理 rejected 状态错误 捕获整条链中的错误
.finally() 无论成功失败都执行 适合清理操作

基础使用示例

typescript 复制代码
fetchData()
  .then(data => processData(data))
  .catch(err => console.error('Error:', err))
  .finally(() => stopLoading());

二、Promise 进阶技巧

1. 组合式 Promise

(1) 并行处理

typescript 复制代码
// 全部成功才算成功
Promise.all([promise1, promise2])
  .then(([result1, result2]) => { /*...*/ });

// 记录全部结果状态
Promise.allSettled([promise1, promise2])
  .then(results => results.forEach(handleResult));

(2) 竞速模式

typescript 复制代码
// 优先完成者胜出
Promise.race([networkRequest, timeout(5000)])
  .then(firstResult => { /*...*/ });

// 首个成功的 Promise
Promise.any([fallbackAPI, primaryAPI])
  .then(firstSuccess => { /*...*/ });

2. 高级错误处理

(1) 错误冒泡机制

typescript 复制代码
fetchData()
  .then(step1)
  .then(step2) // 此处错误会被最后的 catch 捕获
  .catch(handleError); 

(2) 精细化控制

typescript 复制代码
apiCall()
  .then(
    result => handleSuccess(result),
    specificErr => handleKnownError(specificErr) // 仅处理当前阶段错误
  )
  .catch(unexpectedErr => handleCriticalError(unexpectedErr));

3. Promise 化改造

typescript 复制代码
// 回调函数转 Promise
function promisify(fn) {
  return (...args) => new Promise((resolve, reject) => {
    fn(...args, (err, result) => {
      err ? reject(err) : resolve(result);
    });
  });
}

// Node.js 文件操作示例
const readFileAsync = promisify(fs.readFile);

三、工程实践要点

1. 性能优化策略

  • 避免嵌套陷阱:保持 Promise 链扁平化
  • 合理控制并发:使用 Promise.all + 分页加载处理大数据量
  • 内存泄漏防范:及时清理未完成的 Promise 引用

2. 调试技巧

typescript 复制代码
// 添加追踪标记
const tracedPromise = somePromise
  .then(res => {
    console.log('[Trace] Step 1 completed');
    return res;
  });

// 使用 async stack traces
function enableAsyncStacks() {
  Error.stackTraceLimit = 25;
  require('v8').setFlagsFromString('--async-stack-traces');
}

3. 与 async/await 协作

typescript 复制代码
async function workflow() {
  try {
    const data = await fetchData();
    const processed = await transformData(data);
    return persistData(processed);
  } catch (err) {
    await logError(err);
    throw new AppError('Processing failed');
  }
}

四、企业级应用建议

1. 封装统一请求层

typescript 复制代码
class ApiClient {
  private async request<T>(config: RequestConfig): Promise<T> {
    return axios(config)
      .then(res => res.data)
      .catch(err => {
        if (err.response?.status === 401) {
          this.refreshToken();
        }
        throw new NetworkError(err.message);
      });
  }
  
  public getUsers() {
    return this.request<User[]>({ method: 'GET', url: '/users' });
  }
}

2. 构建重试机制

typescript 复制代码
function retry<T>(
  fn: () => Promise<T>, 
  retries = 3, 
  delay = 1000
): Promise<T> {
  return fn().catch(err => 
    retries > 0 
      ? wait(delay).then(() => retry(fn, retries - 1, delay * 2))
      : Promise.reject(err)
  );
}

结语

Promise 作为现代 JavaScript 异步编程的基石,其强大之处不仅在于基础功能,更在于与 async/await 语法、函数式编程范式的深度融合。掌握其核心原理与进阶技巧,将显著提升代码可维护性与异常处理能力。建议在实际项目中结合 TypeScript 类型系统,构建健壮的异步处理体系。

评论

评论

发表评论