如果我需要 3 个循环而不是一个循环来完成它,那么没有副作用有什么意义呢?
What is the point of no side effects if I need 3 loops instead of one to do it?
假设我有一个问题对象列表。我必须确定它们是否可见,如果它们可见,我也必须将它们的答案更改为可见。 (这个例子可能不实际它只是一个例子)
如果这是没有副作用的方式(是吗?):
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。我可能错了什么是副作用,什么不是副作用,以及处理这个问题的两种方法到底是什么。
反对回调和副作用的论点是关于可维护性和回收调用堆栈,因此我们可以使用 throw
和 return
等关键字。
您提供的示例确实使它看起来像是可读性和效率之间的简单工程权衡。也就是说,使用 promise 库,您可以在一个循环中获得相同的结果,而无需 callback/side 效果。
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)
});
});
假设我有一个问题对象列表。我必须确定它们是否可见,如果它们可见,我也必须将它们的答案更改为可见。 (这个例子可能不实际它只是一个例子) 如果这是没有副作用的方式(是吗?):
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。我可能错了什么是副作用,什么不是副作用,以及处理这个问题的两种方法到底是什么。
反对回调和副作用的论点是关于可维护性和回收调用堆栈,因此我们可以使用 throw
和 return
等关键字。
您提供的示例确实使它看起来像是可读性和效率之间的简单工程权衡。也就是说,使用 promise 库,您可以在一个循环中获得相同的结果,而无需 callback/side 效果。
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)
});
});