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

Javascript - avoiding asynchronous race condition when checking object property existence

本文关键字:异步 竞争 条件 存在 检查 对象 属性 是否 Javascript-      更新时间:2023-09-26

虽然JavaScript可能不是多线程的,但它确实支持异步执行,并且两个或多个异步代码位的执行可能在同一个线程上,但无法预测异步事件顺序这一事实使得异步执行之间可能出现竞争条件。

我正在执行异步检查对象属性是否存在。所述属性将被分配一个大型多维子对象,包括子对象数组、自己的属性等。

在下面的例子中,我已经知道父对象存在,即我知道myObject存在。我希望在myObject['myObjectChildren']的所有内容到位后立即对return true进行检查。

为了检查对象属性的存在,我执行以下操作:

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。然而,我担心的是我无意中进入了比赛状态。

由于javascript执行的单线程性质,当在一个同步块中分配值时,您的检查在任何情况下都是正确的,因为在执行分配时,控制流无法"跳转"到您的检查逻辑。