2016-10-28 74 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,ACMEstatenullundefined,但代碼不會拋出錯誤。它實際上應該處理空值/未定義的值。

我只能得到一個錯誤這樣的強行拋出像

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'會拋出。 'obj && obj.prop && obj.prop.subprop'完全可以接受,並且是慣用的JavaScript。你的測試對於一項簡單的任務來說是完全矯枉過正的。而且,這不是OP的問題 - 它似乎與諾言有關。 – vlaz

+0

@vlaz很少將窗口屬性分配給'undefined',但即使他們使用'typeof',它們肯定不會是'boolean'。真正的問題似乎是由deferred = Q.defer()引起的,但是如果OP認爲問題出現在首先指出的布爾分配上,看起來似乎有點矯枉過正,但是這提供了一種方法來確保問題不是在那條線上。 – CPHPython

+0

爲什麼你需要「證明」它考慮到當前的代碼_already_做一個檢查,至少與你的建議一樣好。在某些方面它甚至更好。 OP的代碼中的哪些內容可能會失敗,而這些內容不會在你的內?因爲我看不到會導致錯誤的情況,所以過於嚴格的檢查是多餘的和不必要的。再一次,更重要的是,它甚至沒有解決實際問題。 – vlaz

0

貌似這一切的時候,我一直在使用Chrome測試,但沒有扔一個「類型錯誤」

我已經改變了分配如下IE不會處理這種說法,和IE可以處理它

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

我知道,承諾可以swallow errors,但這裏不是這種情況下,上面的語句甚至會用IE控制檯擺弄,或完全移動的聲明外的承諾拋出一個錯誤方法的身體。所以我認爲Q.defer()是一隻紅鯡魚。

相關問題