如何判断流利方法是否是最后一个被调用的方法

时间:2015-07-24 22:48:03

标签: javascript fluent

我正在尝试为JavaScript项目创建一个类似fluent的API。

目前我有这样的事情:

function Foo(a, b) {
   this.a = a;
   this.b = b;
   this.Set = function(attr, val) {
      this[attr] = val;
      return this;
   },
   this.refresh = function() {
      //do something
   }
};

这允许我写下以下内容:

var foo = new Foo("Hello", "World");
// foo = { a : "Hello", b : "World" }
foo.Set("c", "!");
// foo = { a : "Hello", b : "World", c : "!" }
foo.Set(...);
//...

编写流畅的API的好处是以菊花链方式调用,因此我可以更轻松,更可读地编写foo.Set(...).Set(...).Set(...)

编写基本API很好,但我想知道如何检测菊花链中的最后一个Set调用,因为在此调用中我想调用refresh

我想这样做是为了避免用户需要手动附加.refresh()

有没有人处理过这样的事情?

谢谢, erip

修改

伪代码的期望效果:

function Foo(a, b) {
   this.a = a;
   this.b = b;
   this.Set = function(attr, val) {
      this[attr] = val;
      //if this Set is the last
         // return this.refresh();
      return this;
   },
   this.refresh = function() {
      //do something
   }
};

2 个答案:

答案 0 :(得分:0)

在对另一个答案的评论中,你说你想保留相同的签名,但是你可以通过允许一个可选的第三个参数来进行此操作,该第三个参数进一步表达了刷新的意图,而不仅仅是一个简单的布尔值{ {1}}。用户仍然需要指示刷新(并且可能意外地将其称为除最后true之外的其他位置),但它维护方法链接。

Set

答案 1 :(得分:-2)

也许是这样的:

function Foo(a, b) {
   this.a = a;
   this.b = b;
   this.Set = function(attr, val, isLast) {
      this[attr] = val;
      if(isLast) {
        this.refresh();
      }
   },
   this.refresh = function() {
      //do something
   }
};

foo.Set({})
foo.Set({})
foo.Set({}, true)