像 lodash
这样的库实现了一个 .chain()
方法,其中每个后续的链接方法将返回对 this
的引用,允许链接成为可能 . 其缺点是,在链的末尾,要解析函数集,需要调用 .value()
方法来返回结果值 .
我很好奇是否知道链是否在没有解析器功能的情况下终止?有没有办法让每个单独的方法知道是否有后续调用,如果没有返回结果值?
这是一个例子:
enum Direction {
LEFT = 'LEFT',
UP = 'UP',
DOWN = 'DOWN',
RIGHT = 'RIGHT',
}
class Move {
movement: Direction[];
constructor () {
this.movement = []
}
left () {
this.movement.push(Direction.LEFT)
return this
}
right () {
this.movement.push(Direction.RIGHT)
return this
}
up () {
this.movement.push(Direction.UP)
return this
}
down () {
this.movement.push(Direction.DOWN)
return this
}
resolve () {
return this.movement;
}
}
const m = new Move()
const code = m
.up()
.up()
.down()
.down()
.left()
.right()
.left()
.right()
.resolve();
console.log(code)
我正在寻找一种方法来获得以下内容,并且仍然具有与上面 m
相同的值,通过某种方式改变每个方法 .
const code = m
.up()
.up()
.down()
.down()
.left()
.right()
.left()
.right();
2 回答
不可以 . 您可以使用基本上是轮询且不可靠的超时 .
真实世界
需要一种解决方法并不新鲜,例如下划线使用对
chain
和value
:https://underscorejs.org/#chaining但是,有一种模式允许此终止:
通过使函数独立且"piping",你知道链在
pipe
内结束(注意这些必须是高阶函数) . 例如,rxjs使用此模式,尽管它们根本不关心链的终止 . 它在那里完成的原因(这也很好)是它为您提供了一个易于扩展的操作系统,可以树摇动 .同样地,你可以通过包裹链来回到点链(如果你真的想要它):
chain
方法可以运行提供给它的函数,并且知道在此结束时,链终止 . 因此,假设您的函数返回一个带有value
方法的对象,pipe
/chain
可以在最后隐式调用它:当然,基本上这就是在最后调用
value
的负担 .还有一点需要注意,我可能不会实现类具有这种可变状态,但是,如果你继续使用链接,而是使用不可变对象的路由,并且每个这样的运算符返回一个新对象 . 这使得链条行为更加可预测和合理,因为您不会冒两次应用链序的风险 .