在前端上想要进行封装一个API,用于一次性创建多个post。 请问一般是如何进行封装,是否是需要使用到三方库?

后端有一个接口:
create post : 用于创建一个帖子。

在前端上想要进行封装一个API,用于一次性创建多个post。

请问一般是如何进行封装,是否是需要使用到三方库?

阅读 459
avatarAI BotBETA

实现方案:

  1. 基础封装(无需三方库)

    // 封装批量创建函数
    const batchCreatePosts = async (postsArray) => {
      try {
     // 使用 Promise.all 并行发送请求
     const responses = await Promise.all(
       postsArray.map(post => 
         fetch('/api/posts', {
           method: 'POST',
           body: JSON.stringify(post),
           headers: { 'Content-Type': 'application/json' }
         })
       )
     );
     
     // 处理所有响应
     const results = await Promise.all(responses.map(res => res.json()));
     return { success: true, results };
      } catch (error) {
     // 错误处理增强
     return { 
       success: false, 
       error: error.message,
       partialData: results?.filter(Boolean) || []
     };
      }
    };
    
    // 调用示例
    batchCreatePosts([post1, post2, post3])
      .then(console.log);
  2. 高级场景优化(推荐三方库)

    # 安装优化工具
    npm install axios p-limit
import axios from 'axios';
import pLimit from 'p-limit';

// 创建并发控制器(限制5个并行请求)
const limit = pLimit(5);

const advancedBatchCreate = async (postsArray) => {
  const promises = postsArray.map(post => 
    limit(() => 
      axios.post('/api/posts', post)
        .then(res => ({ status: 'fulfilled', value: res.data }))
        .catch(err => ({ status: 'rejected', reason: err.response?.data }))
    )
  );

  // 使用 allSettled 获取完整结果
  const results = await Promise.allSettled(promises);
  
  // 分类处理结果
  const successful = results.filter(r => r.status === 'fulfilled');
  const failed = results.filter(r => r.status === 'rejected');
  
  return {
    total: postsArray.length,
    successCount: successful.length,
    failedCount: failed.length,
    successful,
    failed
  };
};

关键设计考量:

  1. 并发控制:使用 p-limit 避免浏览器并行请求限制(Chrome 默认6个)
  2. 错误隔离:通过 Promise.allSettled 确保单个失败不影响整体
  3. 重试机制(可扩展):可添加 axios-retry 实现指数退避重试
  4. 进度反馈:可通过事件发射器添加进度回调
  5. 类型安全:推荐使用 TypeScript 定义请求/响应类型

是否需要三方库?

  • ✅ 基础场景:浏览器原生 fetch + Promise 足够
  • ✅ 复杂需求:推荐 axios(拦截器、取消请求) + p-limit(并发控制) + async(队列管理)

最佳实践建议:

  1. 与后端协商添加批量接口(减少网络开销)
  2. 前端添加请求取消功能(AbortController)
  3. 大批量数据使用 Web Worker 处理
  4. 重要操作建议添加本地缓存重试机制
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题