需要一个库或设计模式来处理异步代码中的依赖地狱

Need a library or design pattern for dealing with dependency hell in asynchronous code

本文关键字:异步 处理 代码 地狱 依赖 设计模式 一个      更新时间:2023-09-26

我将描述一个这种"依赖地狱"的简化示例。

想象一个视频播放器有"播放/暂停"answers"静音/取消静音"按钮。暂停视频会暂停声音,但不会使其静音,因此取消视频暂停会取消音频暂停。

然后假设我们在单独的文件中下载音频和视频,因此我们有四个成功/错误回调。想象一下,视频可以在没有音频的情况下播放,但却不能相反。现在想象一下,如果需求更新,视频和音频应该等待对方,那么应该对代码进行多少更改。

目前我正在处理这个使用回调和布尔变量。我有一种感觉,这是石器时代,因为像这样的东西:

if (videoShouldPlay && audioShouldPlay && isAudioPlaying && isVideoDownloaded && isAudioDownloaded) {

或4个类似的回调:

audio.onload = function () {
    if (isVideoDownloaded)
       .....
    } else { ...
}

既不可读也不可维护。依赖项的数量随着组件的数量呈指数增长,但当我可以定义一些通用规则时,我不应该跟踪每个依赖项。

我相信计算机科学已经解决了这个问题。

看来您需要一个状态机。让我们以"正在玩"answers"暂停"的状态为例。过渡效果"playing"的规则➜"paused"应该是你写的:"暂停视频应该暂停声音,而不是静音它"等等。如果没有看到手头上的实际问题,就很难多说。

我推荐敏捷软件开发,原则,模式和实践中的第29章状态用重构到模式中的状态替换状态改变条件。我个人觉得著名的《设计模式:可重用面向对象软件的要素》这本书读起来有些困难,尽管如此,它还是包含了State模式。