In javascript non è possibile utilizzare le istruzioni nelle espressioni. Per questo motivo si è costretti a utilizzare gli operatori logici e ternari in un'espressione quando si desidera utilizzare if o switch ecc. Poiché non volevo utilizzare gli operatori ternari ogni volta che eseguivo un controllo delle condizioni, ho scritto semplici funzioni per controlla le condizioni.
Usandoli scrivo un codice come questo:
this.getEvent('aFrame').on(() => _if(this.isInTextEditor()).true(() => _if(this.getConfig('typeFrame')).true(() => _switch(this.state, {
resume: () => this.bufferStack.check(() => this.animation.nextFrame(this.bufferStack.pop()))
})).false(() => _switch(this.state, {
resume: () => this.animation.nextFrame()
}))));
Migliore formattazione per capire:
this.getEvent('aFrame').on(() =>
_if(this.isInclined()).true(() =>
_if(this.getConfig('typeFrame')).true(() => _switch(this.state, {
resume: () => {
this.bufferStack.check(() => this.animation.nextFrame(this.bufferStack.pop()));
}
})).false(() => _switch(this.state, {
resume: () => {
this.animation.nextFrame();
}
}))
)
);
Le funzioni _if e _switch sono:
const _switch = (a, obj) => {
return obj[a] && obj[a]();
};
const _if = val => {
return {
true(fn) {
val && fn();
return this;
},
false(fn) {
!val && fn();
return this;
}
};
};
Tutto funziona perfettamente con questo codice. Ma voglio solo sapere se ci sono degli svantaggi usando questo invece di operatori logici o ternari:
this.getEvent('aFrame').on(() =>
this.isInclined()
&& ((this.getConfig('typeFrame')
? (this.state === 'resume'
&& this.bufferStack.check(() => this.animation.nextFrame(this.bufferStack.pop())))
: (this.state === 'resume'
&& this.animation.nextFrame()))
)
);
O semplicemente usando le istruzioni:
this.getEvent('aFrame').on(() => {
if (this.isInclined()) {
if (this.getConfig('typeFrame')) {
switch (this.state) {
case 'resume':
this.bufferStack.check(() => this.animation.nextFrame(this.bufferStack.pop()));
break;
default:
break;
}
} else {
switch (this.state) {
case 'resume':
this.animation.nextFrame();
break;
default:
break;
}
}
}
});
Nota: questa domanda è stata spostata da Review del codice di scambio dello stack .