【问题标题】:js method chain tailjs方法链尾
【发布时间】:2015-02-06 08:50:56
【问题描述】:

有没有办法检测链中的方法调用(流利的接口)是否在该链中的 TAIL 位置?

var some = g.f(arg1).f(arg2).f(arg3);

或者我们绝对需要类似的东西

var some = g.f(arg1).f(arg2).f(arg3).end();

我想避免什么?

返回的值对我来说不是那么重要,但我需要在链的末尾计算一些东西(一个内部的类似字符串的键),从一个调用到另一个调用可能有不同的长度。

【问题讨论】:

    标签: javascript fluent method-chaining


    【解决方案1】:

    不,如果函数调用看起来相同,则无法检测给定方法是否位于尾部位置,因为下一个链式调用尚未发生并且解释器没有为您提供任何证据证明是否存在另一个链式调用是否到来。


    您可以选择第二个参数作为您正在寻找的线索:

    var some = g.f(arg1).f(arg2).f(arg3, "end");
    

    然后,您的f() 函数将检查第二个参数是否存在并具有适当的值,如果存在,它可以执行尾部操作。


    或者,您可以制作一个稍微不同的 f() 版本,称为 fTail()(或任何您想要的名称):

    var some = g.f(arg1).f(arg2).fTail(arg3);
    

    fTail() 可能如下所示:

    xxx.prototype.fTail = function() {
        var retVal = this.f.apply(this, arguments);
    
        // now do your tail operations here
    
        return retVal;
    };
    

    正如您所提议的,我想我会使用一系列 args,因为这似乎可以解决您的所有问题,易于使用并且性能良好:

    var some = g.f([arg1, arg2, arg3], fn);
    

    【讨论】:

    • 谢谢,有帮助!我正在尝试实现一个实时网络数据结构,请随时查看我的 github:hefeust/retiare 如果您对此有所了解。我正在尝试决定:g.relation().role(role1 ).role(role2).on('link', function() { ... }) vs g.relation([roles], [handlers]) 也许第二种方法(未链接,完全在数组中指定)将赢......在考虑你的答案之后。问候
    • @HefeustCORTES - 使用单个方法调用接受一组项目既要编写使用它的代码更少,执行起来也比进行 N 链函数调用要快,当然,你会知道什么时候你'已经处理了数组中的最后一个。这并不意味着链接在许多情况下没有用(确实如此),但通常不会一遍又一遍地使用相同的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多