2016-10-28 2 views
0

나는이 javascript 줄에 간헐적 인 오류를 조사하고는이 변수 할당이 오류를 던지는 이유는 무엇입니까?

parentWindowState = window.opener && window.opener.ACME && window.opener.ACME.state 

당신은 함수의 나머지 부분을보고 싶다면, 그 같다 :

_doStuff: function() { 
    var someVar = '', 
     parentWindowState = window.opener && window.opener.ACME && window.opener.ACME.state, 
     deferred = Q.defer(); 

    if (parentWindowState && parentWindowState.getItem('...')) { 
     //lots of code     
    } else { 
     deferred.resolve(); 
    } 
    return deferred.promise; 
} 

사용자는이 오류

를 받고보고있다
Error at _doStuff (https://acme/anvils/yoloeditor/main_20160531050717.js:456321:13) 
at Anonymous function (https://acme/anvils/yoloeditor/main_20160531050717.js:111202:37) 
at _fulfilled (https://acme/anvils/yoloeditor/main_20160531050717.js:29048:13) 
at Anonymous function (https://acme/anvils/yoloeditor/main_20160531050717.js:29078:13) 
at promise.promiseDispatch (https://... 

디버깅 및 변수 설정을 통해이 오류를 재현하려고 시도했습니다. opener, ACMEstate ~ null 또는 undefined이지만 코드는 오류를 발생시키지 않습니다. 실제로 null/undefined 값을 처리하기로되어 있습니다.

내가 할 수있는 유일한 얻을 강제

throw new Error("Boom"); 

과 같은 오류를 던지는하여이 같은 오류 그래서 내 질문이 줄은 오류가 발생 할 수 어떤 상황입니까?

편집 : Chrome으로 테스트하는 동안이 오류를 재현하려고했습니다. ACME가 정의되지 않은 경우 Internet Explorer에서 오류가 발생한다는 것을 알았습니다.

+6

오류 메시지는 무엇을 말합니까? – Quentin

+1

이 오류는'promise.promiseDispatch'라고하고,이 줄에서는'deferred = Q.defer()'를 논리적으로 쓰고 있습니다.이 명령은이 오류를 발생시키는 명령입니다. –

+1

@chsdk 여기에 서서히 미안해하지만, 나는 당신의 요점을 얻지 못한다. 완전한 대답으로 설명해 주시겠습니까? – yannicuLar

답변

0

이전에 정의되지 않은 속성 때문에 오류가 발생할 수 있습니다.

var parentWindowState = window.hasOwnProperty('opener') && window.opener !== null && 
window.opener.hasOwnProperty('ACME') && window.window.opener.ACME !== null && window.opener.ACME && 
window.opener.ACME.hasOwnProperty('state') && window.window.opener.ACME.state !== null && window.opener.ACME.state 

나머지 조항의 실행을 중지합니다 false를 반환하기 때문에 첫 번째 절은 피할 수 : 간단한 방법은 당신이 실제로 그 속성에 액세스하기 전에 예를 들어, 확인 절을이 합류 그들 모두는 보장 그 오류가 던져진다.

필요한 모든 속성을 테스트하고 해당 속성에 boolean 값이 있는지 테스트하기 위해 독립 변수를 만들 수 있습니다. 예 :

var parentWindowOpener = window.hasOwnProperty('opener') 
         && window.opener !== null; 

var pWACME = parentWindowOpener && window.opener.hasOwnProperty('ACME') 
      && window.window.opener.ACME !== null && typeof window.opener.ACME === 'boolean' 
      && window.opener.ACME; 

var pWAState = pWACME && window.opener.ACME.hasOwnProperty('state') 
       && window.window.opener.ACME.state !== null 
       && typeof window.opener.ACME.state === 'boolean' && window.opener.ACME.state; 
+0

'obj.hasOwnProperty ('prop') && obj.prop! == null && obj.prop.subprop ...'이것은 이미 충분하지 않고 이미 존재했던 것을 개선하지 않습니다. 'obj = {prop : undefined} '를 고려하면 두 테스트를 모두 통과하지만'obj.prop.subprop'를하면 throw됩니다. 'obj && obj.prop && obj.prop.subprop'는 완벽하게 수용 가능하고 관용적 인 자바 스크립트입니다. 귀하의 테스트는 간단한 작업에 대한 과잉 충동입니다. 게다가 그것은 OP의 문제가 아니라 약속과 관련이있는 것 같습니다. – vlaz

+0

@vlaz 윈도우 프로퍼티가'undefined'에 할당되는 경우는 거의 없지만'typeof'를 사용하여도 'boolean'이 아닐 것입니다. 진짜 문제는'deferred = Q.defer()'때문인 것으로 보입니다. 그러나 OP가 문제가 부울 할당에 있다고 느낀다면 과도한 것처럼 보일 수 있지만 문제가 아닌지 확인하는 방법을 제공합니다. 그 줄에. – CPHPython

+0

현재 코드를 고려하여 "증명"해야하는 이유는 무엇입니까? 어떤 측면에서는 더 나아졌습니다. OP의 코드에서 실패 할 수있는 것은 당신 것이 아니겠습니까? 오류가 발생하는 상황을 볼 수 없기 때문에 지나치게 엄격한 검사가 중복되어 불필요합니다. 다시 한 번 더 중요한 것은 실제 문제를 해결하지 못한다는 것입니다. – vlaz

0

내가 크롬으로 테스트했습니다 모든 시간처럼 보이지만 IE는 다음과 같이 내가 할당을 변경했습니다는 '형식 오류'

을 던지는없이이 명령을 처리하고, IE되지 않습니다 내가 알고 있어요 그것을

window.opener && (typeof window.opener.ACME == 'object') && window.opener.MOS.ACME 

을 처리 할 수있는 약속 swallow errors을 할 수 있지만 위의 문이 심지어 IE 콘솔 하구, 또는 약속 된 외부 완전히 문을 이동하여 오류가 발생하는 것처럼, 여기 경우가 아니라 그 방법의 시체. 그래서 Q.defer()은 빨간 청어라고 생각합니다.

관련 문제