2013-08-14 1 views
0

revalidator (https://github.com/flatiron/revalidator)에 대한 스키마 정의로 원하지 않는 속성에 대한 Javascript 객체를 확인하고 싶습니다.for..in을 사용하여 이벤트 루프 차단

function strip(object, schema) { 
    var strippedObject = {}; 
    for (var property in schema.properties) { 
     if (schema.properties[property].type === 'object') { 
      strippedObject[property] = strip(object[property], schema.properties[property]); 
     } else { 
      strippedObject[property] = object[property]; 
     } 
    } 
    return strippedObject; 
} 

이 코드를 복사 원하는 속성과 중첩 된 스키마에 재귀 스키마를 통해 동기 루프 :

나는 다음 코드를 내놓았다.

이번에 이벤트 루프를 차단하는 것에 대해 걱정됩니다.

I/O를 수행하지 않으므로 무시해도됩니까? 의견에 대한

편집

감사합니다. jbaylina가 언급 한 것처럼 실제로 스키마는 약 10 개의 속성을 가진 최대 2 개의 레벨로 중첩되어 있습니다. 그럼에도 불구하고 나는 setImmediate는 IT 작동을 사용하여 시도했지만 정말 문제가있을 때 어쩌면 비동기 적으로 반복하는 것입니다 :

function strip(object, schema, callback) { 
    var strippedObject = {}; 
    async.each(Object.keys(schema.properties), function (property, next) { 
     if (schema.properties.hasOwnProperty(property)) { 
      if (schema.properties[property].type && schema.properties[property].type === 'object') { 
       strip(object[property], schema.properties[property], function (err, obj) { 
        if (err) return next(err); 
        strippedObject[property] = obj; 
        next(); 
       }); 
      } else { 
       strippedObject[property] = object[property]; 
       next(); 
      } 
     } 
    }, function (err) { 
     if (err) return callback(err); 
     return callback(null, strippedObject); 
    }); 
} 

이 정말 더러워 보이지만, 작업 및 테스트를 전달합니다. 이 솔루션에 대해 어떻게 생각하십니까?

답변

1

거대한 복소 객체 그래프는 재귀이기 때문에 무시할 수 없습니다. 재귀 적이므로 setTimeout 또는 setImmediate 내부의 다음 재귀 호출을 쉽게 감싸서 이벤트 루프를 확보 할 수 있습니다.

Re : 편집은 성능 측면에서보기에 좋습니다. 리팩토링되어 읽기 쉽도록 보이지만 문제 영역과 솔루션을 확실하게 이해하고 있다고 생각합니다.

+0

+1을 참조하십시오. 본질적으로 재귀 호출을 받아서 루프 스택의 끝에 넣으므로 루프의 위치를 ​​유지하지만 다른 것들은 먼저 차단하게합니다. –

+0

고마워, 제발 내 편집 고려하십시오. – thertweck

0

스키마에 수천 개의 속성이 없으면 문제가되지 않습니다. 서브 루틴이 "표준 환경"에서 최악의 경우에 걸리는 시간을 측정 해보십시오. 시간이 허용되지 않으면이 루프를 여러 조각으로 나눌 수 있습니다. setImmediate의 경우 Prevent long running javascript from locking up browser

+0

이것은 브라우저에 관한 것이 아니라 노드에 관한 것이지만 스키마가 작기 때문에 아마도 맞을 것입니다. – thertweck