Javascript - 在检查对象属性存在时避免异步竞争条件

时间:2015-02-05 11:02:47

标签: javascript object asynchronous properties race-condition

虽然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') === truemyObject['myObjectChildren']一旦分配了所有内容,请记住它是一次性分配的。是否存在支票可能失败的情况?例如在赋值时,属性是否首先实例化为'undefined'

目前,我的代码仅在其所有内容到位时才返回true。但是,我担心的是我无意中陷入了竞争状态。

1 个答案:

答案 0 :(得分:1)

由于javascript执行的单线程特性,在所有情况下,当在一个同步块中分配值时,检查是正确的,因为控制流在执行赋值时无法“跳转”到检查逻辑。 / p>