我找不到https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/forEach的任何提示,但基本上我正在尝试:
sessions.forEach(function (session, id) {
someConditionReached(id, function(err, res)) {
if (shouldDelete(err, res)) {
sessions.delete(id);
}
}
});
这会造成什么麻烦吗?如果是这样,我应该制作一个临时数组来收集所有过时的会话并在forEach
之后删除它们吗?问题是,循环中的条件是基于异步/回调的,因此进行延迟删除会很麻烦。
答案 0 :(得分:2)
你问过
删除javascipt映射的forEach循环中的条目是否安全?
但也说
问题是,循环中的条件是基于异步/回调的,因此延迟删除会很麻烦。
(感谢Thilo在我错过它时指出了这一点!)
这意味着您在forEach
期间不删除。在forEach
完成之后,这些回调在之后之前不会发生。例如,他们已经推迟了。所以问题"删除javascipt地图的forEach循环中的条目是否安全?" 不适用,因为你不这样做。作为Thilo points out in a comment,唯一真正关心的问题是id
是否仍然是您正在删除的内容的有效标识符以及删除是否仍然合适(在这两种情况下,可能是它,但它&# 39;值得一试。)
但回答标题中的问题(对于未来的读者),让我们稍微更改一下代码,以便以后在异步回调中不进行删除:
sessions.forEach(function(session, id) {
if (shouldDelete(session)) {
sessions.delete(id);
}
});
当MDN让您失望时,请转到the specification:
地图的[[MapData]]的每个条目仅访问一次。访问
forEach
后,添加了新密钥。如果密钥在访问后被删除,然后在forEach调用完成之前重新添加,则将重新访问该密钥。 除非在forEach
电话完成之前再次添加密钥,否则在访问“forEach
”之后和访问之前删除的密钥都不会被访问。
(我的重点)
强调位清楚表明在forEach
期间删除不是问题。