Когда метод зависит от другого метода

#javascript

#javascript

Вопрос:

Каков наилучший способ справиться со следующей ситуацией в JavaScript.

У меня есть три метода ( m1 , m2 , m3 ), и последний ( m3 ) зависит от результатов двух других ( m1 , m2 ).

Таким образом, это работает, но мне любопытно узнать, есть ли лучший способ написать код в этой ситуации, особенно для будущих разработчиков, которые будут читать код.

 var O = function () {
    this.p = 0;
}

O.prototype.makesomething = function () {
    var that = this;
    that.m1();
    that.m2();
    that.m3();
}

O.prototype.m1 = function () {O.p  }; // it changes the value O.p
O.prototype.m2 = function () {O.p  }; // it changes the value O.p
O.prototype.m3 = function () {return O.p}; // m3 depends by m1, m2 because it needs to get the update value of O.p
  

Комментарии:

1. Вам всегда нужно будет вызывать эти три функции в этом конкретном порядке? Или вы можете вызывать m1, m2 и m3 в разных порядках или не все три сразу?

2. Я переписываю код; кстати, если я прочитаю следующий код, я могу предположить, что m1, m2 и m3 независимы; но фактически m3 не является, так как я могу сделать это явным?

3. Из предоставленного вами кода не очевидно, как именно меняется операционная система? Не забудьте предоставить минимальный пример рабочего кода, ожидаемое поведение и что происходит не так.

4. Я не знаю, были ли эти комментарии рядом с определениями функций просто для того, чтобы помочь объяснить ваш вопрос, но в вашем реальном коде обязательно добавьте комментарий, который прояснит, что m3 должен вызываться после двух других, это первое и самое простое, что вы можете сделать, чтобы помочь людям, читающим код вбудущее. Если функции всегда вызываются в таком порядке, вы можете сделать их частными функциями либо внутри makesomething , либо внутри новой doM1M2M3 функции, которая может быть вызвана из makesomething и других мест. Или вызовите m3 изнутри m2.

5. Так что, может быть, лучшим способом будет использование обратного вызова?

Ответ №1:

Во-первых, я не знаю наверняка, но помещение this.p = 0 внутрь O не имеет смысла в сочетании с O.p . Вы, вероятно, имеете в виду this.p внутри m3 , когда ссылаетесь на экземпляр.

В любом случае, если вы ищете удобство чтения, вы могли бы создать несколько простых, но идиоматических функций, подобных этой: http://jsfiddle.net/ZvprZ/1 /.

 var O = function () {
    this.p = 0;
}

O.prototype.makesomething = function () {
    var that = this;

    var result = when( that.m1(), that.m2() )
                .then( that.m3() );

    return resu<
}

O.prototype.m1 = function () {this.p  };
O.prototype.m2 = function () {this.p  };
O.prototype.m3 = function () {return this.p};
  

when / then может быть довольно простым, поскольку он ничего не делает, кроме как делает его более читаемым:

 (function(window) {
    var when, then, o;

    when = function() {
        return o; // just return the object so that you can chain with .then,
                  // the functions have been executed already before executing
                  // .when
    };

    then = function(a) {
        return a; // return the result of the first function, which has been
                  // executed already (the result is passed)
    };

    o = { when: when,
          then: then };

    window.when = when; // expose
    window.then = then;
})(window);