【问题标题】:What is the point of no side effects if I need 3 loops instead of one to do it?如果我需要 3 个循环而不是 1 个循环,那么没有副作用有什么意义?
【发布时间】:2017-03-14 12:25:58
【问题描述】:

假设我有一个问题对象列表。我必须找到它们是否可见,如果它们可见,我也必须将它们的答案更改为可见。 (这个例子可能不实用,它只是一个例子) 如果这是没有副作用的方式(是吗?):

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 次才能完成工作,为什么要选择无副作用的方式?

附言。我可能错了什么是副作用,什么不是,以及处理这个问题的两种方法到底是什么。

【问题讨论】:

  • 我认为如果您使用纯无副作用的代码,您将不会返回原始的answer;您将返回原始答案的副本,但将isVisible 设置为true。在这种情况下,为了避免副作用而费尽心机是没有意义的。
  • 如果 JS 的 mapfilter 是惰性的,你实际上只迭代一次。
  • 正如 Zev 所提到的,您在第二个map 中无论如何都在执行副作用,因此您在强制执行功能样式但坚持命令式实践。两者混合得不好。

标签: javascript side-effects


【解决方案1】:

反对回调和副作用的论点是关于可维护性和回收调用堆栈,因此我们可以使用像 throwreturn 这样的关键字。

您提供的示例无疑使它看起来像是在可读性和效率之间进行的简单工程权衡。也就是说,使用 Promise 库,您可以在一个循环中实现相同的结果,而无需回调/副作用。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-25
    • 1970-01-01
    相关资源
    最近更新 更多