2016-11-10 8 views
1

페이지에 특정 요소를 표시할지 여부를 나타내는 오브젝트를 리턴하는 평가자가 50 개 이상의 개별 평가를 포함합니다. 따라서 객체 구성원의 잘못된 사용을 탐지하는 것은 쉽지 않습니다. , showButton 제대로 평가하지 위의 예에서오브젝트 구성원의 유효하지 않은 사용을 감지하십시오.

var simpleExample = { 
    evaluationSet1: { 
     foo: true 
    }, 
    evaluationSet2: { 
     bar: true 
    }, 
    showButton: null 
}; 

//Accidental mis-use 
simpleExample.showButton = simpleExample.evaluationSet1.bar && simpleExample.evaluationSet2.bar; 

및 evaluationSet1.bar가 정의되어 있지 않기 때문에 거짓이 될 것이다 : 여기에 내가 나에게 주소를하는 데 도움이되는 도구를 발견하고자하는 문제의 간단한 예입니다 목적. 올바른 구문은 다음과 같습니다.

simpleExample.showButton = simpleExample.evaluationSet1.foo && simpleExample.evaluationSet2.bar; 

이러한 종류의 잘못된 유스 케이스를 감지하는 데 도움이되는 도구가 있습니까? 나는 Jshint와 Jslint를 시도해 봤지만 어느 쪽도 플래그를 붙일 수는 없다.

+1

타이프 라이터 ...... –

+0

아니, 우리의 응용 프로그램에서 그것을 사용할 수 없습니다 우리는 아직 ECMA6 아니에요. –

+2

나는 거의 농담을하고 있었다. ;-) 나는 자바 스크립트의 동적 특성을 감안할 때 강력한 타이핑 없이는 할 수있는 도구가 될 것이라고 생각하지 않는다. 당신이 작성한 것은 기술적으로 유효합니다. evaluationSet1.bar에 bar 속성이 없으면 evaluationSet1.bar를 호출 할 때 무엇이 ​​있는지 알아보십시오! 그것은 정의되지 않았을 수도 있지만 여전히 존재합니다. –

답변

1

대기열을 사용하십시오. 평가가 순차적이며 필요한 경우 evaluationSet1에서 evaluationSetN까지 처리하십시오. 그렇지 않으면 오류가 발생합니다. 즉, simpleExample의 모든 속성에 액세스하는 옵션을 제공하지 마십시오. 프로세스를 시작할 수있는 evaluationSet1에만 액세스 할 수있는 기능을 제공하고 evaluationSetN에서 프로세스를 완료 할 수 있습니다.

메인 스레드

const worker = new Worker("worker.js"); 

function handleMessageEvent(event) { 
    if (event.data) { 
    console.log("evaluation is true", event.data) 
    } else { 
    console.log("evaluation is false", event.data) 
    } 
} 

worker.addEventListener("message", handleMessageEvent); 
worker.postMessage("evaluation"); 

Worker 스레드

function handleWorkerEvent(event) { 
    let bool = true; 
    if (event.data !== "evaluate") { 
    bool = false; 
    self.postMessage(bool); 
    return; 
    } 

    for (let prop of Object.keys(simpleExample)) { 
    let curr = simpleExample[prop]; 
    if (curr) { 
     let keys = Object.keys(curr); 
     if (keys.length) { 
     for (let key of keys) { 
     if (!curr[key]) { 
      bool = false; 
      break; 
     } 
     } 
     } 
    } else { 
     bool = false; 
     break; 
    } 
    } 
    self.postMessage(bool); 
} 

self.addEventListener("message", handleWorkerEvent); 

data.js

const simpleExample = { 
    evaluationSet1: { 
     foo: true 
    }, 
    evaluationSet2: { 
     bar: true 
    }, 
    showButton: null 
}; 

plnkr http://plnkr.co/edit/imPuzjz14lcAFmHHWdRX?p=preview