需要一个库或设计模式来处理异步代码中的依赖地狱
Need a library or design pattern for dealing with dependency hell in asynchronous code
我将描述一个这种"依赖地狱"的简化示例。
想象一个视频播放器有"播放/暂停"answers"静音/取消静音"按钮。暂停视频会暂停声音,但不会使其静音,因此取消视频暂停会取消音频暂停。
然后假设我们在单独的文件中下载音频和视频,因此我们有四个成功/错误回调。想象一下,视频可以在没有音频的情况下播放,但却不能相反。现在想象一下,如果需求更新,视频和音频应该等待对方,那么应该对代码进行多少更改。
目前我正在处理这个使用回调和布尔变量。我有一种感觉,这是石器时代,因为像这样的东西:
if (videoShouldPlay && audioShouldPlay && isAudioPlaying && isVideoDownloaded && isAudioDownloaded) {
或4个类似的回调:
audio.onload = function () {
if (isVideoDownloaded)
.....
} else { ...
}
既不可读也不可维护。依赖项的数量随着组件的数量呈指数增长,但当我可以定义一些通用规则时,我不应该跟踪每个依赖项。
我相信计算机科学已经解决了这个问题。
看来您需要一个状态机。让我们以"正在玩"answers"暂停"的状态为例。过渡效果"playing"的规则➜"paused"应该是你写的:"暂停视频应该暂停声音,而不是静音它"等等。如果没有看到手头上的实际问题,就很难多说。
我推荐敏捷软件开发,原则,模式和实践中的第29章状态和用重构到模式中的状态替换状态改变条件。我个人觉得著名的《设计模式:可重用面向对象软件的要素》这本书读起来有些困难,尽管如此,它还是包含了State模式。
相关文章:
- 异步处理所有事件处理程序的方法
- 如何异步处理:函数C取决于函数B取决于函数A
- 如何处理异步获取的数据
- Javascript/JQuery处理并发/异步调用和数据竞争
- 使用异步模块的Express + Mongoose请求处理程序的更简洁的方法
- 直接 Web 远程处理异步问题
- ExtJs 处理异步调用
- 处理异步函数
- 使用Canvas和ForEach处理异步调用
- 处理角控制器中异步更新的正确方法
- 如何在angular.js中处理多个异步任务
- 处理函数中的异步调用(Firebase)
- 节点 JS Express 模块是否异步处理请求
- 异步处理不影响 React+Flux 中视图的数据
- 使用一个小模型来测试异步处理
- 在Node.js中异步处理数组
- 如何在异步处理过程中解析对象
- 使用javascript异步处理多个XMLHTTP请求
- 串行地处理异步处理的消息队列
- 当所有异步处理程序完成时执行javascript函数