删除javascript地图的forEach循环中的条目是否安全?

时间:2016-09-05 09:49:18

标签: javascript collections foreach ecmascript-6

我找不到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之后删除它们吗?问题是,循环中的条件是基于异步/回调的,因此进行延迟删除会很麻烦。

1 个答案:

答案 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期间删除不是问题。