[javascript] cursor.forEach ()에서“계속”

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 ofcontinue대신은 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()
);


답변