【发布时间】:2016-06-10 20:21:40
【问题描述】:
我正在尝试创建一个阻塞控制流,但已经走到了死胡同。 这个想法是一个请求进来并流经许多处理函数。每个功能都会做一些事情并决定现在是否满足请求。如果是,则处理停止,如果不是,则调用下一个处理程序。 每个处理程序可能会或可能不会异步执行某些操作(例如获取/写入数据)。如果是这种情况,则以下处理程序依赖于在启动之前存在的数据。
到目前为止,我有两个想法,都不太符合这些要求:
1) 所有处理程序都是函数,它们被推入一个数组并使用 some 进行迭代。如果处理程序希望停止控制流,它只需要返回true。
使用这种方法,我不能让任何处理程序调用异步函数。
2) 所有处理程序都是链接的承诺。这对我来说似乎是一个更好的主意,但我不知道如何最好地处理停止控制流。我有两个想法:
- 一旦处理程序决定中断流,保留一个设置为true 的变量。在每个处理程序中检查此值并在需要时立即解决。这意味着很多重复的代码。
- 如果不希望继续正常流程,则拒绝承诺,并继续catch。然而,使用错误来控制流程的想法让我很痛苦——这也意味着我必须处理由于实际错误而调用 catch 的情况。
我的感觉告诉我必须有另一种方法,但我想不通。
【问题讨论】:
-
一些 Promise 实现,如
bluebird,提供promise cancellation。 -
基本上,您是在要求寻找任一单子。哪个承诺或多或少是。我推荐this talk,尽管它是专门针对节点的。对于一个实际的答案,我认为使用拒绝来停止流动是可以的。没有什么表明它意味着“错误”,这只是一个语义约定
-
编辑限制后的错字:上面应该专门说 not 节点...
标签: javascript node.js promise