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

标签 javascript angularjs asynchronous promise

我最近一直在使用 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/

相关文章:

javascript - 在 HTML5 Canvas 中撕裂?

html - Angular Material 在移动设备上没有响应

swift - 多个异步测试和期望

javascript - 包括 href 和 onclick 到 HTML <a> 标签

javascript - 获取脚本标签所在的 DOM 元素

javascript - Angular GroupBy 使用无 ng-repeat

javascript - Angular JS : Http:get on JSON created by local API

asynchronous - 在 foreach 循环中,等待不起作用

Node.js:如何使异步数据全局可用

javascript - DoubleClick Studio ClickTag 编码中未捕获的 ReferenceError