为了账号安全,请及时绑定邮箱和手机立即绑定

在函数中拒绝不返回错误

在函数中拒绝不返回错误

梵蒂冈之花 2021-12-02 17:03:21
在这个挑战中,使用 Javascript Promises 来计算各种几何形状的面积。形状有正方形、长方形、圆形和三角形,每个形状的面积都可以使用以下公式计算:边'a'的正方形:面积=a2长'l'宽'w'的矩形:面积= wx lCircle of radius 'r': 面积 = Pi x r2 底边 'b' 和高度 'h' 的三角形:面积 = 0.5 xbx h 注意:确保使用 Pi 的值为 3.14 并将所有形状的面积四舍五入到小数点后两位。函数描述完成函数getAreas,它接受一个形状数组及其各自的边,并返回一个代表所有形状的区域数组的promise。另外,完成辅助函数calculateArea,它采用单个形状及其边/边,并返回一个代表其面积的promise。getAreas 返回的promise 的规范如下:该promise 合并了calculateArea 返回的所有promise 的输出形状。由calculateArea返回的promise的规范如下:如果传递给Promise的shape有效,则用各自shape的计算面积来解析。如果传递给Promise的shape无效,则用[-1]拒绝一切. It returns a Promise which on success, returns area of the shape, and on failure returns [-1].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( [-1]);         }    })}// Complete the generateArea function below.// It returns a Promise which on success, returns an array of areas of all the shapes and on failure, returns [-1].let getAreas = (shapes, values_arr) => {    return new Promise((resolve, reject) => {        let areas_array = [];        for(let i= 0; i < shapes.length; i++) {            calculateArea(shapes[i], values_arr[i])            .then(area => {                areas_array.push(area);                })            .catch(error => {                console.log(error)              })        }        resolve(areas_array)    })}以上是我尝试过的,但是当出现奇怪的形状 tp [-1] 时,它不会拒绝areas_array
查看完整描述

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 不是函数,因此它不返回任何内容。你可以说它解决了某些事情。


查看完整回答
反对 回复 2021-12-02
  • 1 回答
  • 0 关注
  • 146 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信