2016-09-05 4 views
2

나는 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/forEach에 어떤 힌트를 찾을 수 있지만, 기본적으로 내가 할 노력하고 있어요 :자바 스크립트 맵의 forEach 루프 내에서 항목을 삭제해도 안전합니까?

sessions.forEach(function (session, id) { 
    someConditionReached(id, function(err, res)) { 
     if (shouldDelete(err, res)) { 
     sessions.delete(id); 
     } 
    } 
}); 

겠습니까이 원인이 어떤 문제가? 그렇다면 그냥 임시 배열을 만들어서 폐기 된 모든 세션을 수집하고 forEach 후에 제거해야합니까? 문제는 루프의 조건이 비동기/콜백 기반이므로 지연된 삭제를 수행하는 것이 번거롭다는 점입니다.

+0

무엇이'sessions.delete()'입니까? –

+1

@NinaScholz : 맵에서 항목을 제거하는 방법입니다. http://www.ecma-international.org/ecma-262/7.0/index.html#sec-map.prototype.delete. –

+0

내가 볼 수있는 유일한 문제는 나중에 (루프 이후, 콜백이 시작되기 전에) 세션이 확장되고 있으며 더 이상 삭제되지 않아야한다고 결정하는 것입니다. 그러나 아마도'shouldDelete'가 그것을 처리합니다. – Thilo

답변

2

당신은

IT는 javascipt지도의 foreach 루프 내에서 항목을 삭제하는 것이 안전합니다 요청했습니다?

는 또한

문제가 루프 상태가 비동기/콜백 기반 즉,이고, 그래서 지연 삭제를 할 성가신 것이다.

(나는 그것을 놓친 때를 지적 해 주셔서 Thilo 감사합니다!)

당신이 forEach 동안 하지 삭제있어 의미한다. 이러한 콜백은 이후까지 forEach이 완료된 후에 발생합니다. 예 : 이미 지연되었습니다. 그래서 질문이 "forEach 루프 내에서 항목을 삭제하는 것이 안전합니까?"은 적용되지 않으므로 적용되지 않습니다. Thilo points out in a comment으로, 유일한 진짜 관심사는 id이 여전히 삭제하려는 항목에 대한 유효한 식별자인지 여부와 삭제가 여전히 적절한 지 여부입니다. (두 경우 모두 가능할 수도 있지만 신고할만한 가치가 있습니다.)


그러나 (미래의 독자) 제목의 질문에 대답하는 것은,의 그것은 비동기 콜백 이후에 삭제를하고 있지 그래서 조금 그 코드를 변경할 수 : MDN이 아래로 다음을 수행 할 수 있습니다 때

sessions.forEach(function(session, id) { 
    if (shouldDelete(session)) { 
     sessions.delete(id); 
    } 
}); 

the specification :

지도의 [[MapData]]의 각 항목은 한 번만 방문됩니다. forEach에 대한 호출이 시작된 후 추가 된 새 키를 방문합니다. 키는 방문한 후에 삭제 된 다음 forEach 호출이 완료되기 전에 다시 추가 된 경우 다시 방문됩니다. forEach 호출 이후에 삭제 된 키는 forEach 호출이 완료되기 전에 키가 다시 추가되지 않으면 방문하지 않습니다.

(내 강조)

강조된 비트는 분명히 forEach 동안 삭제하면 문제가 아니라고한다.

+2

여기서'forEach'는 삭제 요청이 내려지기 전에 완료됩니다 (모두 콜백에서 발생하기 때문에). 그래서 삭제 될 키셋을 만드는 동안 아무 것도 추가되거나 제거되지 않습니다 (그리고'forEach'가 키셋에 영향을주지 않은 후에 일어나는 모든 것). – Thilo

+0

실제로 콜백 내에서 삭제가 발생했다는 것을 지적 해 주셔서 감사합니다. 이것이 사실이지만, 콜백이 실제로 _synchronous_ 인 경우에 삭제가 forEach가 끝나기 전에 일어날 수는 없습니까? libary/module 함수를 호출하기 때문에 콜백이 동기화인지 비동기인지 만 추측 할 수 있습니다. – user826955

+0

@ user826955 : 전혀 * 추측해서는 안됩니다. 라이브러리에 콜백을 허용하는 API가 있고 해당 설명서에 동 기적으로 또는 비동기 적으로 호출할지 여부가 명확하게 표시되지 않으면 라이브러리 설명서에 심각한 버그가 있으며이를보고하고 처리해야합니다. –

관련 문제