使用高阶函数(如Array.map()
)执行一些副作用的循环是否合法(或良好做法)?
这主要是一个理论问题,因为我注意到有时我使用.map()
方法发现(或自己执行)一些循环,如下所示:
let myObject = {...}
let myItemsArray = [ ... , ... ]
myItemsArray.map( (item, index) => {
// do some side effect for ex:
myObject.item[index] = item
}
但我知道这个map()
方法实际上返回一个数组。所以调用myItemsArray.map()
就像我返回一个数组而不将其分配给任何变量一样。
那么问题来了,这合法吗?我应该避免这种情况并使用经典的for()
循环还是.forEach()
方法?
附带问题:我问这个问题的原因之一是因为我需要在异步函数上执行一些循环,因此涉及承诺和等待运算符,我记得forEach()
循环在异步函数上并不理想,但想知道为什么。
那么问题来了,这合法吗?我应该避免这种情况并使用经典的 for() 循环还是 .forEach() 方法?
如果未从 map 函数返回任何内容,则应改用forEach
。你最终会得到相同的结果,但你并不意味着,对于任何维护你的代码的人来说,你正在返回一些有用的东西。
问这个问题的原因之一是因为我需要在异步函数上执行一些循环,因此涉及承诺和等待运算符,我记得 forEach() 循环在异步函数上并不理想,但想知道为什么。
forEach
和map
都不会await
你传递给它的函数是否返回一个承诺(async
函数都会返回)。
因此,这里有三种可能的情况:
// Your loop
...myItemsArray...
// Code that comes after the loop
...etc...
A:循环中的项需要按顺序处理
使用常规for ()
循环,因为外部函数不会暂停。
B:循环中的项可以并行处理,后面的代码不需要等待
使用forEach
.
C:后面的代码需要等待循环中的所有内容完成
使用map
.将返回的承诺数组传递给Promise.all
。然后await
。