虽然JavaScript可能不是多线程的,但它确实支持异步执行,而对于2个或更多异步位代码的执行可能在同一个线程上,事件的异步顺序无法预测,这使得它成为可能对于发生异步执行之间的竞争条件。
我正在进行异步检查是否存在对象属性。将为所述属性分配一个大型多维子对象 - 包括子对象数组,自己的属性等。
在下面的示例中,我已经知道父对象存在,即我知道myObject
存在。只要 return true
的所有内容 到位,我就希望我的支票myObject['myObjectChildren']
。
要检查对象属性是否存在,我执行以下操作:
if(myObject.hasOwnProperty('myObjectChildren'))
return true;
myObject['myObjectChildren']
被分配的唯一方式是格式,但这个分配是异步完成的:
myObject['myObjectChildren'] = {
largeChildObject:{
grandchildren:[
{grandchild1:{
grandchild1GreatGrandChildren:[
grandchild1GreatGrandChild1:{},
grandchild1GreatGrandChild2:{}....
]
},
{grandchild2:{},
{grandchild3:{}....
]
}
};
我的问题:
我的问题是,我能否安全地假设myObject.hasOwnProperty('myObjectChildren') === true
,myObject['myObjectChildren']
一旦分配了所有内容,请记住它是一次性分配的。是否存在支票可能失败的情况?例如在赋值时,属性是否首先实例化为'undefined'
?
目前,我的代码仅在其所有内容到位时才返回true。但是,我担心的是我无意中陷入了竞争状态。
答案 0 :(得分:1)
由于javascript执行的单线程特性,在所有情况下,当在一个同步块中分配值时,检查是正确的,因为控制流在执行赋值时无法“跳转”到检查逻辑。 / p>