首页 文章

是否有一种方法可以让一组类方法知道何时终止呼叫?

提问于
浏览
0

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 回答

  • 1

    每个单独的方法是否有办法知道是否有后续调用,如果没有返回结果值?

    不可以 . 您可以使用基本上是轮询且不可靠的超时 .

    真实世界

    需要一种解决方法并不新鲜,例如下划线使用对 chainvaluehttps://underscorejs.org/#chaining

  • 2

    但是,有一种模式允许此终止:

    input.pipe(up(), up(), left());
    

    通过使函数独立且"piping",你知道链在 pipe 内结束(注意这些必须是高阶函数) . 例如,rxjs使用此模式,尽管它们根本不关心链的终止 . 它在那里完成的原因(这也很好)是它为您提供了一个易于扩展的操作系统,可以树摇动 .

    同样地,你可以通过包裹链来回到点链(如果你真的想要它):

    input.chain(chain => chain.left().up());
    

    chain 方法可以运行提供给它的函数,并且知道在此结束时,链终止 . 因此,假设您的函数返回一个带有 value 方法的对象, pipe / chain 可以在最后隐式调用它:

    chain(chainer: (obj: MyObj) => MyObj) { 
      return chainer(this).value(); 
    }
    

    当然,基本上这就是在最后调用 value 的负担 .


    还有一点需要注意,我可能不会实现类具有这种可变状态,但是,如果你继续使用链接,而是使用不可变对象的路由,并且每个这样的运算符返回一个新对象 . 这使得链条行为更加可预测和合理,因为您不会冒两次应用链序的风险 .

相关问题