webflux 大佬求教,编程范式疑问 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
myCupOfTea
V2EX    程序员

webflux 大佬求教,编程范式疑问

  •  
  •   myCupOfTea 2021-09-23 00:18:25 +08:00 2230 次点击
    这是一个创建于 1531 天前的主题,其中的信息可能已经有所发展或是发生改变。

    webflux 是不是很容易写出回调地狱啊
    话说原本很简单的一个场景,查询 User 和 UserInfo 的信息,然后复制给 OperInfo
    webflux 写出来总感觉怪怪的

    // mvc User user = userRepository.findById(xxx); UserInfo userInfo = userInfoRepository.findById(xxx); OperInfo operInfo = new OperInfo(); BeanUtils.copyProperties(user, operInfo); BeanUtils.copyProperties(userInfo, operInfo); return operInfo; 

    我 webflux 写成了下面,不知道应该怎么写才是最佳实践

    // webflux Mono<User> user = userRepository.findById(xxx); Mono<UserInfo> userInfo = userInfoRepository.findById(xxx); return Mono.zip(user, userInfo).flatmap(data -> { User user = data.getT1(); UserInfo userInfo = data.getT2(); OperInfo operInfo = new OperInfo(); BeanUtils.copyProperties(user, operInfo); BeanUtils.copyProperties(userInfo, operInfo); return operInfo; }) 
    4 条回复    2021-09-23 13:05:42 +08:00
    myCupOfTea
        1
    myCupOfTea  
    OP
       2021-09-23 00:19:29 +08:00
    而且我中间一旦有很多外部调用,回调写到爆炸,好难受
    JamesChen
        2
    JamesChen  
       2021-09-23 08:05:45 +08:00
    webflux 不容易写出回调地狱。我写了几十 W 行 reactor-core ( webflux 的底层异步实现),基本都没写出过回调地狱。如果有略微“接近”回调地狱的代码,那也是为了减少中间 Publisher ( Mono/Flux )中间对象与对象传递时的开销,如果不关心这些开销,拆成扁平结构也都是没问题的。

    具体操作而言,可以把大块的回调函数拆成多个函数,或拆除多个代码逻辑块。如果要看具体代码,可以参考下面这个超长函数,该函数涉及多个异步操作,但是并没有出现回调地狱,代码都比较扁平: https://github.com/turms-im/turms/blob/9e9cd17e3a1bb5fb3cc32519082885b2ac9f0dba/turms-service/src/main/java/im/turms/service/workflow/access/servicerequest/dispatcher/ServiceRequestDispatcher.java#L152

    另外,webflux 没人带,或者自己不怎么想深入专研,不太推荐使用,因为很容易就用错了,而且你还不知道。可以考虑等等 loom (估计 2 年后的时)。
    zhenjiachen
        3
    zhenjiachen  
       2021-09-23 10:50:19 +08:00
    如果不想写回调地狱可以看看 kotlin 的 coroutines,在方法上加个 suspend 配合 reactor 就像写同步代码一样。
    myCupOfTea
        4
    myCupOfTea  
    OP
       2021-09-23 13:05:42 +08:00
    @JamesChen 好的,谢谢拉,我只是要改造 spring cloud gateway 不得已要写
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     897 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 21:18 PVG 05:18 LAX 13:18 JFK 16:18
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86