Skip to content

瀑布流异常处理

四种异常情况类型

1. 图片加载失败

  • 触发条件:原始内容(如图片)加载失败
  • 对应状态ORIGINAL_FAILED
  • 事件来源loaded(event) 函数中 event?.type !== 'load'

2. 占位图加载失败

  • 触发条件:在显示占位图时,占位图也加载失败
  • 对应状态FINAL_FALLBACK
  • 事件来源onPlaceholderError() 函数

3. 重试后仍然失败

  • 触发条件:在重试模式下,达到最大重试次数后仍然失败
  • 对应状态FINAL_FALLBACK
  • 事件来源handleFailureRetry()retryCount <= 0

4. 超时

  • 触发条件:在 MAX_WAIT 时间内未完成加载
  • 对应状态TIMEOUT
  • 事件来源useTimeout 回调函数

四种处理模式对异常的响应策略

typescript
errorHandlingMode?: 'none' | 'placeholder' | 'retry' | 'fallback'
异常类型none 模式placeholder 模式retry 模式fallback 模式
图片加载失败直接结束,使用默认高度显示占位图重试 N 次重试 N 次
占位图加载失败❌ 不涉及显示文字兜底❌ 不涉及显示文字兜底
重试后仍失败❌ 不涉及❌ 不涉及使用默认高度显示占位图
超时使用默认高度使用默认高度使用默认高度使用默认高度

异常处理流程图

原始内容加载

   成功?
   ↙   ↘
  是     否
  ↓      ↓
 完成   根据模式处理

    ┌─────────────────┐
    │  none: 直接结束  │
    │  placeholder:   │
    │    显示占位图    │
    │  retry: 重试    │
    │  fallback:     │
    │    重试→占位图   │
    └─────────────────┘

状态枚举与异常类型的映射

typescript
const ItemStatus = {
  NONE: 'none',                    // 正常状态
  ORIGINAL_FAILED: 'fail',        // 异常类型1: 图片加载失败
  PLACEHOLDER_SUCCESS: 'phok',     // 占位图成功(非异常)
  TIMEOUT: 'timeout',              // 异常类型4: 超时
  FINAL_FALLBACK: 'final',         // 异常类型2,3: 占位图失败/重试失败
}

关键设计思想

  1. 异常类型是客观事实:无论什么模式,异常类型都是固定的
  2. 处理模式是主观策略:根据业务需求选择不同的应对方式
  3. 渐进式降级:从最理想的状态逐步降级到可接受的兜底方案
  4. 统一超时保护:所有模式都有超时机制,防止无限等待

这样的设计既保证了异常情况的完整覆盖,又提供了灵活的处理策略选择。

Released under the MIT License.