Как я могу вызвать любую функцию в цепочке функций без цепочки? - PullRequest
0 голосов
/ 06 июня 2011

Извините, если мой вопрос не был достаточно ясен.Я положу свой код здесь ...

var chain = {
    'fn_1' : {
             //fn_1 code here
             chain.fn_2();},
    'fn_2' : {
             //fn_2 code here
             chain.fn_3();}

...and so on
}

Скажем, если я хочу вызвать chain.fn_1 (), есть ли способ сделать это без вызова chain.fn_2 ()?

То, о чем я могу думать прямо сейчас, - это флаг, но это было бы много лишних флагов, вероятно, для каждой функции.Ребята, у вас есть идеи?

Ответы [ 3 ]

5 голосов
/ 06 июня 2011

Если последовательность функций вызывает следующую правильную, вам нужен какой-то флаг.По всей вероятности, лучше всего было бы изменить ваши функции так, чтобы они возвращали ссылку на объект.Тогда вы можете сделать цепочку так:

var chain = {
  'fn_1': function () {
    // do something here.
    return this;
  },
  'fn_2': function () {
    // do something here.
    return this;
  },
  'fn_3': function () {
    // do something here.
    return this;
  }
};

// call the full chain:
chain.fn_1().fn_2().fn_3();

// call only the middle.
chain.fn_2();
1 голос
/ 06 июня 2011

gddc ответ лучше, но если вы не можете изменить объект по какой-то причине, вы можете сделать это:

var _oldFn2 = chain.fn_2
chain.fn_2 = function() { return; };
chain.fn_1();
chain.fn_2 = _oldFn2;
0 голосов
/ 06 июня 2011
var chain = {
    fn : ['fn1', 'fn2', 'fn3'],
    call : function(name) {
       var i = 0, pos = -1, l = this.fn.length;
        for(i = 0; i < l; i += 1) {
            if(this.fn[i] == name) {
                pos = i;
            }
            if(pos !== -1) {
                this[this.fn[i]]();             
            }
        }

    },
    fn1 : function() {
        alert('fn1');
    },
    fn2 : function() {
        alert('fn2');
    },
};
chain.call('fn1'); //chain
chain.fn1(); //single
...