Javascript 如何在接受参数的承诺数组上使用Promise.all()?

Javascript 如何在接受参数的承诺数组上使用Promise.all()?,javascript,node.js,es6-promise,Javascript,Node.js,Es6 Promise,如何编写Promise.all()函数从大小不同的数组中获取参数 我想将参数传递给Promise类的.all()方法中接受的承诺数组。最好的方法是什么?使用map let locArr=[{ x:0,, y:0 }, { x:2, y:4 }, { x:6, y:8 }]; //返回承诺的异步函数 函数findLoc(x,y){ 返回新承诺((解决、拒绝)=>{ 设a=setTimeout(()=>{ 决心({ x:x*x, y:y*y }); }, 500); }); } 我保证( 本地映射

如何编写
Promise.all()
函数从大小不同的数组中获取参数


我想将参数传递给
Promise
类的
.all()
方法中接受的承诺数组。最好的方法是什么?

使用
map

let locArr=[{
x:0,,
y:0
}, {
x:2,
y:4
}, {
x:6,
y:8
}];
//返回承诺的异步函数
函数findLoc(x,y){
返回新承诺((解决、拒绝)=>{
设a=setTimeout(()=>{
决心({
x:x*x,
y:y*y
});
}, 500);
});
}
我保证(
本地映射(o=>findLoc(o.x,o.y))
)。然后(值=>{
//所有的价值来自于所有的承诺
console.log(值)
});您可以使用:


这是一个需要稍微修改
findLoc
输入的技巧:

let locArr = [{ x: 0, y: 0 }, { x: 2, y: 4 }, { x: 6, y: 8 }];

// my asynchronous function that returns a promise
function findLoc(x, y) {
    return new Promise((resolve, reject) => {
        let a = setTimeout(() => {
            resolve({ x: x * x, y: y * y });
        }, 500);
    });
}

Promise.all(
  locArr.map(//map location to promise
    location=>findLoc(location.x,location.y)
  )
).then(values => {
    // all values from all the promises
});

如其他人所说,使用map,但也可以调整
findLoc()
函数以获得最简单的读数:

让locArr=[{x:0,y:0},{x:2,y:4},{x:6,y:8}];
//返回承诺的异步函数
函数findLoc(坐标){
返回新承诺((解决、拒绝)=>{
设a=setTimeout(()=>{
解析({
x:坐标.x*坐标.x,
坐标,坐标,坐标
});
}, 500);
});
}
允诺
.全部(本地地图(findLoc))
。然后(值=>{
log(JSON.stringify(value,false,2));

});这段代码乍一看是正常的,有什么问题吗?您应该创建数组
const x=locArr.map(a=>findLoc(a.x,a.y))
并在Promise内传递
x
。all@andy我不想硬编码传递到promises@indapublic你能再解释一下吗?@EmmanuelNK试试这个承诺(locArr.map(a=>findLoc(a.x,a.y)))。然后(values=>{console.log(values);});好的,我现在明白了。我考虑过使用map,但我认为map会在运行promise.all()之前先运行每个异步函数。我在编写map函数时犯了一个错误。我在那里有些混乱。谢谢!在这种情况下如何使用
catch
?@tharinduluck
Promise.all(locArr.map(o=>findLoc(o.x,o.y))。然后(value=>{console.log(values)})。catch(()=>{})
这就是你想要的吗?@TharinduLucky似乎是
承诺。一切都解决了
适合你的需要。@TharinduLucky注意兼容性。chrome 76+支持。你可能需要配置
babel
。这确实增加了什么额外的信息?@PatrickRoberts这是一个比赛条件。Xian的答案在我打开时没有显示问题。答案也在注释中,但应该作为答案添加。你能再解释一下吗?答案中findLoc的输入参数是对象吗?@EmmanuelNK是的,它实际上是一个对象。对象Rest Destructuring有助于删除变量赋值的一个步骤。我不确定是否正确的术语是“Destructuring assignment”。您可以在此处阅读更多内容:
let locArr = [{ x: 0, y: 0 }, { x: 2, y: 4 }, { x: 6, y: 8 }];

// my asynchronous function that returns a promise
function findLoc(x, y) {
    return new Promise((resolve, reject) => {
        let a = setTimeout(() => {
            resolve({ x: x * x, y: y * y });
        }, 500);
    });
}

Promise.all(
  locArr.map(//map location to promise
    location=>findLoc(location.x,location.y)
  )
).then(values => {
    // all values from all the promises
});
let locArr = [{ x: 0, y: 0 }, { x: 2, y: 4 }, { x: 6, y: 8 }];

// my asynchronous function that returns a promise
// 
function findLoc({x, y}) {
    return new Promise((resolve, reject) => {
        let a = setTimeout(() => {
            resolve({ x: x * x, y: y * y });
        }, 500);
    });
}

Promise.all(locArr.map(findLoc)).then(values => {
    console.log(values);
});