meteor.js와 MongoDB를 사용하여 앱을 만들고 있는데 cursor.forEach ()에 대한 질문이 있습니다. 각 forEach 반복의 시작 부분에서 일부 조건을 확인한 다음 작업을 수행하지 않아도되면 요소를 건너 뛰고 시간을 절약 할 수 있습니다.
내 코드는 다음과 같습니다.
// Fetch all objects in SomeElements collection
var elementsCollection = SomeElements.find();
elementsCollection.forEach(function(element){
if (element.shouldBeProcessed == false){
// Here I would like to continue to the next element if this one
// doesn't have to be processed
}else{
// This part should be avoided if not neccessary
doSomeLengthyOperation();
}
});
cursor.find (). fetch ()를 사용하여 커서를 배열로 바꾼 다음 일반 for-loop를 사용하여 요소를 반복하고 계속 사용하고 정상적으로 중단 할 수 있지만 forEach ( ).
답변
를 반복 forEach()
할 때마다 제공 한 함수가 호출됩니다. 주어진 반복 내에서 추가 처리를 중지하고 다음 항목을 계속 return
하려면 적절한 시점에서 함수에서 수행하면됩니다.
elementsCollection.forEach(function(element){
if (!element.shouldBeProcessed)
return; // stop processing this iteration
// This part will be avoided if not neccessary
doSomeLengthyOperation();
});
답변
제 생각에는 블록 으로 돌아가는 것은 무의미한 filter
방법 을 사용하여이를 달성하는 가장 좋은 방법입니다 forEach
. 스 니펫에 대한 예는 다음과 같습니다.
// Fetch all objects in SomeElements collection
var elementsCollection = SomeElements.find();
elementsCollection
.filter(function(element) {
return element.shouldBeProcessed;
})
.forEach(function(element){
doSomeLengthyOperation();
});
이것은 당신을 좁히고 처리해야 할 요소를 elementsCollection
유지합니다 filtred
.
답변
여기에 사용하여 솔루션 for of
과 continue
대신은 forEach
:
let elementsCollection = SomeElements.find();
for (let el of elementsCollection) {
// continue will exit out of the current
// iteration and continue on to the next
if (!el.shouldBeProcessed){
continue;
}
doSomeLengthyOperation();
});
내부에서 작동하지 않는 루프 내부에서 비동기 함수를 사용해야하는 경우 좀 더 유용 할 수 있습니다 forEach
. 예를 들면 다음과 같습니다.
(async fuction(){
for (let el of elementsCollection) {
if (!el.shouldBeProcessed){
continue;
}
let res;
try {
res = await doSomeLengthyAsyncOperation();
} catch (err) {
return Promise.reject(err)
}
});
})()
답변
JavaScript 단락 평가를 사용합니다. 만약 el.shouldBeProcessed
, true를 반환doSomeLengthyOperation
elementsCollection.forEach( el =>
el.shouldBeProcessed && doSomeLengthyOperation()
);