Отклонить в функции, не возвращая ошибку - PullRequest
0 голосов
/ 24 октября 2019

В этом задании используйте Javascript Promises для расчета площадей различных геометрических форм. Фигуры имеют форму квадрата, прямоугольника, круга и треугольника, и площадь каждого из них может быть вычислена с использованием следующих формул: квадрат стороны 'a': площадь = a2 прямоугольник длины 'l' и ширины 'w': площадь = wx lкруг радиуса'r': Area = Pi x r2Треугольник основания 'b' и высоты 'h': Area = 0.5 xbx hNote: Убедитесь, что значение Pi равно 3.14, и округлите области всех фигур до 2 десятичных знаков.

Описание функцийПолностью завершите функцию getAreas, которая принимает массив фигур и соответствующие им стороны и возвращает обещание, представляющее массив областей всех фигур. Кроме того, завершите вспомогательную функцию executeArea, которая принимает одну фигуру и ее сторону / стороны, а также возвращает обещание, представляющее его область. Спецификации обещания, возвращаемого getAreas, следующие: Это обещание объединяет выходные данные всех обещаний, возвращаемых CalcuArea дляформы. Спецификации обещания, возвращаемого методом calcArea, следующие: Если форма, переданная в Обещание, действительна, разрешите ее с помощью вычисленной области соответствующей формы. Если форма, переданная в Обещание, недействительна, отклоните все с помощью [-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)

    })
}

Вышесказанное - это то, что я пробовал, но оно не отвергает area_array при возникновении странных фигур tp [-1]

1 Ответ

1 голос
/ 24 октября 2019

resolve(areas_array) собирается разрешить обещание для пустого массива, поскольку ни один из then обратных вызовов еще не выполнен.

Итак, сначала сгенерируйте массив обещаний (каждыйиз которых вы получаете от вызова 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);

Также терминология примечания: я изменил комментарий в коде, потому что сказал, что обещание возвращает что-то в случае успеха вводит в заблуждение: обещание нефункция, и поэтому она ничего не возвращает. Вы можете сказать, что разрешает к чему-то.

...