2015-07-24 3 views
1

Я пытаюсь создать API-интерфейс fluent для проекта JavaScript.Как определить, является ли текучий метод последним, который будет называться

В настоящее время у меня есть что-то вроде этого:

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 в d aisy-chain, потому что в этом звонке я хотел бы позвонить refresh.

Я хотел бы сделать это, чтобы пользователь не мог вручную добавить .refresh().

Кто-нибудь имел дело с чем-то подобным?

Спасибо, erip

EDIT

Желаемый эффект в псевдокоде:

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 
    } 
}; 
+0

Итак, в 'foo.Set(). Set(). Set()' вы хотите, чтобы первые два вызова 'Set' возвращали' this', но последний возвращал что-то другое? – Oriol

+0

@Oriol если возможно, я бы хотел, чтобы последний 'Set' был' void', в основном. – erip

+1

Вы не можете. И если вы можете найти какую-то взломать эту работу, это, наверное, плохая идея! – Evert

ответ

-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) 
+0

Я бы хотел чтобы поддерживать подпись функции, если это возможно. – erip

+0

@erip Я не думаю, что это возможно, ваша программа не может автоматически узнать, если вы сделали вызов метода Set. Вы должны создать какой-то идентификатор для него ... параметр, вызов функции и т. Д. –

0

В комментариях к другой ответ вы сказать вы хотели бы сохранить одну и ту же подпись, но вы могли бы сделать это, разрешив дополнительный третий аргумент, который, кроме того, выражает намерение обновить, а не просто пустой логический true. Пользователь по-прежнему должен указывать обновление (и может случайно называть его где-то другим, кроме последнего Set), но он поддерживает цепочку методов.

Смежные вопросы