无需登录 数据私有 本地保存

异步瀑布流模拟器 - 顺序执行异步任务演示

11
0
0
0

异步瀑布流模拟器

演示异步任务按顺序执行,数据从上一步传递到下一步

Waterfall Pattern
预设场景:
执行日志 0
等待执行...
常见问题与知识点

异步瀑布流是一种顺序执行异步任务的设计模式。每个任务按序执行,前一个任务的输出作为下一个任务的输入,就像瀑布的水流一样从上到下逐级传递。这种模式在需要依赖数据流的场景中非常常见,例如:

• 数据处理管道(ETL流水线)
• 多步骤表单验证
• 顺序API调用(后一个请求依赖前一个的响应)
• 图片/视频多阶段处理

在JavaScript中,可以使用 async/await 链式调用或 Array.reduce 配合Promise来实现瀑布流模式。著名的 async.js 库也提供了 async.waterfall 方法。

核心区别在于执行顺序和数据依赖:

特性Waterfall(瀑布流)Promise.all
执行顺序严格顺序,一个接一个并行执行,同时发起
数据依赖前一步输出→后一步输入各任务独立,无数据传递
总耗时≈ 各步骤耗时之和≈ 最慢任务的耗时
适用场景有依赖关系的任务链互不依赖的独立任务
错误影响某步失败则后续全部跳过一个失败不影响其他(allSettled除外)
简单来说:需要数据传递和顺序保证时用Waterfall,追求速度和并发时用Promise.all。

使用 async/awaitfor...of 循环是实现瀑布流最清晰的方式:

async function waterfall(initialValue, tasks) {
    let result = initialValue;
    for (const task of tasks) {
        result = await task(result); // 前一步输出作为下一步输入
    }
    return result;
}

// 使用示例
const tasks = [
    async (val) => val * 2,           // 步骤1:加倍
    async (val) => val + 10,          // 步骤2:加10
    async (val) => `结果: ${val}`,    // 步骤3:格式化
];
waterfall(5, tasks).then(console.log); // 输出: "结果: 20"
也可以使用 Array.reduce 配合Promise链来实现,但for...of配合await的可读性更好。

在异步瀑布流中,错误处理通常有以下几种策略:

1. 快速失败(Fail Fast):任一步骤失败立即终止整个流程,后续步骤不再执行。这是最常见的策略。

2. 携带错误继续:将错误信息封装到数据中传递给下一步,让后续步骤决定如何处理。

3. 降级处理:某步骤失败时使用默认值或缓存数据替代,保证流程继续。

4. 重试机制:失败步骤自动重试N次后再决定是否终止。

// 带重试的瀑布流步骤
async function stepWithRetry(fn, input, maxRetries = 3) {
    for (let i = 0; i < maxRetries; i++) {
        try {
            return await fn(input);
        } catch (err) {
            if (i === maxRetries - 1) throw err;
            await new Promise(r => setTimeout(r, 1000)); // 等待后重试
        }
    }
}

以下是异步瀑布流模式的典型应用场景:

用户注册流程:验证输入 → 检查邮箱是否已存在 → 加密密码 → 写入数据库 → 发送确认邮件
订单处理管道:校验库存 → 计算运费 → 应用优惠券 → 创建支付 → 生成订单
内容发布审核:敏感词过滤 → 图片审核 → 质量评分 → 自动标签 → 发布
数据迁移ETL:提取数据 → 清洗转换 → 数据验证 → 加载到目标库
AI推理管道:文本预处理 → 模型推理 → 后处理 → 格式化输出

任何需要步骤间数据传递顺序敏感的异步流程,都适合使用瀑布流模式。