微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

javascript-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();
}

当我编写此逻辑时,我突然意识到,如果两个诺言都同时解决(当他们访问共享资源时),可能存在潜在的竞争状况.考虑了一会儿之后,我意识到post(..)解析在帖子返回后正在执行,这意味着该代码正在JavaScript的同步执行环境中运行.

有人可以为我提供一些有关两个是否CombinedArray.concat(arr);的信息吗?如果两个诺言都同时解决,那么声明可能会引起问题?

[编辑]
在一些评论之后,我只想补充一点,我不介意将数组连接到CombinedArray中的顺序如何.

解决方法:

JavaScript是单线程的,即使运行异步调用也可以防止出现竞争情况.

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

因为JS最初是单线程的,并且运行时中的所有内容都依赖于JS(并且旧代码假定是这样),所以它们不能仅仅添加多线程和潜在的竞争条件.它会破坏一切.因此,此代码将始终正确且安全地工作,因为将诺言添加到单个队列中并一个一个解决.

即使在Web Worker(以及等效的节点)中,每个“线程”也具有隔离的内存空间,无法直接从另一个线程访问变量. Web Worker特别使用postMessage method来序列化对象,并以安全的方式将它们发送到另一个线程.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐