在函数中拒绝不返回错误

在这个挑战中,使用 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


梵蒂冈之花
浏览 159回答 1
1回答

茅侃侃

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

相关分类

JavaScript