异步流程控制: 分离回调-像写同步代码一样写异步代码

complecateFuture-wrapper

分离 action 与 callback, 用简洁的方式处理异步操作树. 只需要.call(name) .then(name, before) .anyOf(name, …before)的组合就能处理业务逻辑.
在这里插入图片描述

Definition Callback

    // 定义Action, 不需要带泛型
    SupplierAction actionA = new SupplierAction<>("actionA", () -> fetchA());
    SupplierAction actionB = new SupplierAction<>("actionB", () -> fetchB());
    
    // 带有入参的action分2步创建, 可以使用泛型.
    // <CInfo> in left is necessary
    SupplierAction<CInfo> actionC = new SupplierAction("actionC");
    actionC.setAction(() -> fetchC(
           // fetchC(): a.say(), b.say()
           actionC.getProp(0, AInfo.class),
           actionC.getProp(1, BInfo.class),
           actionC.getProp(2, String.class)
    ));
    
    // <CInfo, DInfo> in right is necessary
    FunctionAction actionD = new FunctionAction<CInfo, DInfo>("actionD", (c) -> {
       c.say();
       return fetchD();
    });
    
    // consumer表达式可以修改入参对象, 前提是使用sync(), 但是不能返回其他对象
    ConsumerAction<DInfo> actionE = new ConsumerAction("actionE");
    actionE.setAction((d) -> {
       d.say();
       d.setName("D from actionE");
    });

Add To Container

    // 创建容器并添加action
    ActionDefinitionContainer container = new ActionDefinitionContainer()
            .addSupplier(actionA, actionB, actionC)
            .addFunction(actionD)
            .addConsumer(actionE);

Definition action sequence

    ActionActuator actuator = ActionActuator.build(container);
    CompletableFuture e = actuator.call("actionA", "actionB")
            .callOfParam("actionC", getFuture("actionA"), getFuture("actionB"), "name-c")
            .andThen("actionD")
            .andThen("actionE", "name-e")
            .closeBranch();

    Object result = e.get();
    System.out.println(result); // consumer return null

    CompletableFuture d = actuator.getResult("actionD");
    DInfo dInfo = (DInfo) d.get();
    dInfo.say(); // This is D from actionE

Run

This is A
This is B
This is name-c
This is D
null
This is D from actionE

anyOf

alt anyOf(consumer)
alt anyOf(function)

C等待A,B其中任意一个完成, CompletableFuture要求anyOf的lambda必须使用Consumer或Function, 但是Function的返回值无效. 不知道是bug还是限制.

alt anyOf-function-consumer

allOf

alt allOf-function

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值