最近我一直在使用JavaScript Promise,遇到了以下情况,让我开始思考:
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(..)
解析是在post返回后执行的,这意味着该代码正在JavaScript的同步执行环境中运行。请问是否有人能够为我提供一些清晰的解释,说明两个
combinedArray.concat(arr);
语句是否会在两个Promise同时解决时出现问题?[编辑] 根据一些评论,我想要补充说明的是,我不介意将数组按任意顺序连接到
combinedArray
中。
combinedArray
有一个预定的顺序,那么就会出现竞争条件。但是,两个JavaScript回调函数永远不会同时被调用。 - Bergithen
处理程序。 - Jeff BowmanPromise.all()
。实际上,你的具体代码示例需要使用类似Promise.all()
的东西,否则你就无法知道两个异步操作何时完成,以及combinedArray
实际上包含了结果。如果你展示给我们更多的代码,我们可以向你展示如何使用Promise.all()
。 - jfriend00