#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);