gpt4 book ai didi

javascript - Promise 是异步解决还是同步解决?

转载 作者:行者123 更新时间:2023-11-29 10:08:36 25 4
gpt4 key购买 nike

我最近一直在使用 JavaScript promises,遇到以下情况让我开始思考:

var combinedArray = [];

function getArrayOne() {
$http.post(arrayOnePath).then(function(arr) {
combinedArray = combinedArray.concat(arr);
}) // More code preventing me from using Promise.all(...)
}

function getArrayTwo() {
$http.post(arrayTwoPath).then(function(arr) {
combinedArray = combinedArray.concat(arr);
}) // More code preventing me from using Promise.all(...)
}

function getAllArrays() {
getArrayOne();
getArrayTwo();
}

当我在编写这个逻辑时,我突然意识到,如果两个 promise 同时解决(因为它们访问共享资源),则可能存在潜在的竞争条件。在考虑了一会儿之后,我意识到 then(..) 决议是在帖子返回后执行的,这意味着这段代码是在 JavaScript 的同步执行环境中运行的。

如果两个 promise 同时 resolve,有人可以为我澄清一下这两个 combinedArray.concat(arr); 语句是否会导致问题吗?

[编辑]根据一些评论,我只想补充一点,我不介意将数组连接到 combinedArray 中的顺序。

最佳答案

JavaScript 是单线程的,即使在运行异步调用时也能防止竞争条件。

在某些情况下,JS 会在后台使用另一个线程,例如节点的 I/O 函数,而 web worker API 允许您生成一个隔离但独立的线程(无法访问内存,但它们可以传递消息)。

因为 JS 最初是单线程的,运行时中的一切都依赖于它(旧代码假定它),他们不能只添加多线程和潜在的竞争条件。它会破坏一切。因此这段代码将始终正确且安全地工作,因为 promise 将被添加到单个队列并一个接一个地解析。

即使在 web workers(和等效的节点)中,每个“线程”都有一个独立的内存空间,不能直接从另一个线程访问变量。网络 worker 专门使用 postMessage method序列化对象并以安全的方式将它们发送到另一个线程。

关于javascript - Promise 是异步解决还是同步解决?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38226979/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com