Javascript 此过程是否用于读取和更新模块级数组变量;线程安全;?

Javascript 此过程是否用于读取和更新模块级数组变量;线程安全;?,javascript,Javascript,最近,有人对我编写的以下函数提出了疑问。他们认为这不是“线程安全的”,因此,可能会造成竞争条件,并最终导致不一致和不可预测的结果 const activeModalErrorMessages: string[] = [] export const showModalErrorMessages (title: string, message: string) { const activeErrorCheck = `${title}-${message}`; // filter out

最近,有人对我编写的以下函数提出了疑问。他们认为这不是“线程安全的”,因此,可能会造成竞争条件,并最终导致不一致和不可预测的结果

const activeModalErrorMessages: string[] = []

export const showModalErrorMessages (title: string, message: string)
{
   const activeErrorCheck = `${title}-${message}`;
   // filter out repeating error message modal that is still open on screen
  if (!activeModalErrorMessages.includes(activeErrorCheck)) {
    activeModalErrorMessages.push(activeErrorCheck);
    notification.error({
      message: title,
      description: message,
      duration: 0,
      onClose: () => {
        activeModalErrorMessages = activeModalErrorMessages.filter(
          item => item !== activeErrorCheck,
        );
      },
    });
  }
}

据我所知,javascript是单线程的。因此,我看不出对上述函数的两个调用是如何同时发生并创建“竞争条件”的。我是对还是错

虽然JavaScript确实是单线程的,但它也是异步的。这意味着可以在不阻塞线程的情况下调用函数,因此可能会发生争用情况。下面是它的外观:

setTimeout(()=>console.log('Expect Fifth'),5);
setTimeout(()=>console.log('Expect Second'),1);//抢先
setTimeout(()=>console.log('Expect Fourth'),3);
setTimeout(()=>console.log('Expect First'),0);//得了第二名

setTimeout(()=>console.log('Expect Third'),2)
javascript通常是单线程的(但是对于webworker,您可以有许多线程甚至可以共享内存),但可以异步运行代码。因此,只要不使用web workers,代码是线程安全的,但如果使用异步元素,则可能存在争用条件。
onClose
函数从代码的其余部分异步运行。`let t=[];异步函数pusher(){if(!t.includes('world'))t.push('world');}let promises=[];对于(让i=0;i<20;i++){promises.push(pusher();}Promise.all(promises)。然后(()=>console.log(t))//['world']`数组中只有一个'world'。这难道不意味着承诺兑现时就没有种族条件了吗?