Какой смысл не иметь побочных эффектов, если мне нужно 3 цикла вместо одного, чтобы сделать это?
Представьте, что у меня есть список объектов, которые являются вопросами. Я должен найти, видимы ли они, и если они видны, я должен также изменить их ответ на видимый. (Пример может быть не практичным, это просто пример) Если это не способ побочных эффектов (не так ли?):
questions.filter(function(question) {
return question.isVisible;
})
.map(function(visibleQuestion) {
return getAnswer(visibleQuestion);
})
.map(function(answer) {
answer.isVisible = true;
});
и это побочный эффект:
questions.forEach(function(question) {
if (question.isVisible) {
var answer = getAnswer(visibleQuestion);
answer.isVisible = true;
}
});
Зачем выбирать способ без побочных эффектов, если вам приходится повторять 3 раза, чтобы выполнить свою работу?
PS. Я могу ошибаться в отношении того, что является побочным эффектом, а что нет, и что на самом деле было бы двумя способами справиться с этим.
1 ответ
Аргумент против обратных вызовов и побочных эффектов связан с ремонтопригодностью и восстановлением стека вызовов, поэтому мы можем использовать такие ключевые слова, как throw
а также return
,
Приведенный вами пример, безусловно, делает его простым инженерным компромиссом между удобочитаемостью и эффективностью. При этом, используя библиотеку обещаний, вы можете достичь тех же результатов без обратного вызова / побочного эффекта - все в одном цикле.
promise.all(questions.map(function(question) {
if (question.isVisible) {
resolve(getAnswer(question));
}
}).then(function (arResults) {
arResults.forEach(function(answer) {
answer.isVisible = true;
console.log(answer)
});
});