2016-10-28 65 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()是一只红鲱鱼。

相关问题