1 回答
TA贡献1842条经验 获得超21个赞
resolve(areas_array)将把承诺解析为一个空数组,因为还没有then执行任何回调。
所以首先生成一个 promise 数组(每一个都是通过调用 获得的calculateArea),然后调用Promise.all:
let getAreas = (shapes, values_arr) => {
return Promise.all(shapes.map((shape, i) => calculateArea(shape, values_arr[i])))
.catch(() => [-1]);
}
您应该在这个级别下决心[-1],而不是在calculateArea. 在那里你可以使用reject()和传递你喜欢的任何东西。它没有被使用。
旁注:当你有一个(或多个)承诺时,就像你从调用中得到的一样calculateArea,没有必要创建另一个new Promise依赖于这些承诺的承诺。这样做是一种反模式
演示:
let calculateArea = (shape, values) => {
return new Promise((resolve, reject) => {
switch(shape) {
case 'square':
resolve(values[0]*values[0]);
break;
case 'rectangle':
resolve(values[0] * values[1]);
break;
case 'circle':
resolve(values[0]*values[0] * 3.14);
break;
case 'triangle':
resolve(0.5 * values[0]*values[1]);
break;
default:
reject();
}
});
}
// Complete the generateArea function below.
// It returns a Promise which on success,
// resolves to an array of areas of all the shapes and on failure, resolves to [-1].
let getAreas = (shapes, values_arr) => {
return Promise.all(shapes.map((shape, i) => calculateArea(shape, values_arr[i])))
.catch(() => [-1]);
}
getAreas(['square', 'circle'], [[10], [5]]).then(console.log);
还有一个注意术语:我更改了代码中的注释,因为说Promise 在成功时返回某些内容是一种误导:promise 不是函数,因此它不返回任何内容。你可以说它解决了某些事情。
添加回答
举报