Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 两个异步任务能否同时访问同一阵列?_Javascript_Typescript_Asynchronous - Fatal编程技术网

Javascript 两个异步任务能否同时访问同一阵列?

Javascript 两个异步任务能否同时访问同一阵列?,javascript,typescript,asynchronous,Javascript,Typescript,Asynchronous,假设您有一个由一个异步进程修改的数组,然后您有另一个异步进程从同一个数组中读取。修改和读取是同步完成的。现在的问题是,当数组被写进程修改时,读进程是否能够以某种方式访问数组 根据经验,我知道它不能,而且当同步操作正在进行时,线程以及它操作的所有资源(包括数组)都将被阻塞。对吗?但是,从逻辑上讲,JavaScript是单线程的,还是在规范中明确列出的 现在的问题是,当数组被写进程修改时,读进程是否能够以某种方式访问数组 不,JavaScript是单线程的。通过JS并发访问相同数据的唯一方法是在两个

假设您有一个由一个异步进程修改的数组,然后您有另一个异步进程从同一个数组中读取。修改和读取是同步完成的。现在的问题是,当数组被写进程修改时,读进程是否能够以某种方式访问数组

根据经验,我知道它不能,而且当同步操作正在进行时,线程以及它操作的所有资源(包括数组)都将被阻塞。对吗?但是,从逻辑上讲,JavaScript是单线程的,还是在规范中明确列出的

现在的问题是,当数组被写进程修改时,读进程是否能够以某种方式访问数组

不,JavaScript是单线程的。通过JS并发访问相同数据的唯一方法是在两个不同的JS脚本之间使用一些共享资源。在web上,可以是具有SharedArrayBuffers的WebWorkers,在NodeJ上,一些数据库允许并发变异

但是,从逻辑上讲,JavaScript是单线程的,还是在规范中明确列出的

规范确实定义了线程,称为代理:

8.3代理

代理包括一组ECMAScript执行上下文、一个执行上下文堆栈、一个正在运行的执行上下文、一个 一组命名作业队列、一个代理记录和一个执行线程。除了正在执行的线程外 代理只属于该代理


这意味着所有代码都在同一线程(作业队列)上运行,所有变量只能从一个线程(执行上下文)访问。在不同的代理(线程)之间共享内存的唯一方法是使用SharedArrayBuffer,您需要不同的代理(例如Webworkers)。

我要做的一个方法是制作3个数组

 let kingArray = [];
 let arrayForProcess1 = [];
 let arrayForProcess2 = [];

 someProcessOneExecution().then(response => {
    if (kingArray.length === 0) {
       arrayForProcess1 = response;
    } else {
       doSomethingWithResponse(response);
    }
 });

 someProcessTwoExecution().then(response => {
    if (kingArray.length === 0) {
       arrayForProcess2 = response;
    } else {
       doSomethingWithResponse(response);
    }
 });

 function doSomethingWithResponse() {
    // so something here..
 }
这并不完全是您所要求的,但是javascript事件循环或调用堆栈将逐个执行它们。因为JS是单线程的。它将等待这些承诺得到解决,因为它们是I/O基础,并且随着它们得到解决。可以是
process1
process2
。您可以手动检查它们,就像上面的方法一样,这不是最理想的方法

第二种方法

在这种情况下,我要做的一件事是将这两个承诺链接在一起,等待它们逐一解决,并相应地更新我的数组


我个人的意见(2美分的意见)我永远不会尝试同时更新同一个数组,如果这是本场景中的用例,可能需要重新考虑问题执行策略。

Javascript在单个线程上执行,我建议您阅读一下javascript中异步操作的工作原理。您是否有特定的问题,或者这只是一个一般性的问题?如果你有一个特定的问题,应该概述一下,据我所知,worker的后台线程是在建议或测试版中。比如共享工作者或网络工作者。但目前对于您的问题,Nodejs是单线程的,我不认为您不能共享来自不同进程的相同变量访问,即使使用依赖注入。使用IPC将更改传达给主进程和子进程以实现数据共享。您可以使用redis之类的工具在进程之间共享变量,尽管这是一种可行且常用的解决方案。Faik确实定义了线程模型,但其余的都是单线程的。原子学似乎很有趣,(y)我不知道他们。@bergi什么是特工?我刚刚在说明书中发现了,看起来可能是这样related@JonasWilms我想这是线程的概括(但我自己还没有读过规范),很有趣,我没有注意到MDN页面上提到过它。