Как мне вернуть номер из обещания? - PullRequest
0 голосов
/ 04 декабря 2018

Я пытаюсь вернуть число (costPerProduct), которое я буду использовать, чтобы «поместить» данные в объект, но эта функция возвращает объект обещания, а не просто число :( Что мне здесь делать?

Это мой код:

const calculateExpense = async function (proName) {
        let expensePerProduct = 0;
        fetch('/purchase')
            .then(result => {
                if (result.status >= 400) {
                    throw new Error(result.status);
                } else {
                    return result.json();
                }
            })
            .then(result => {
                let totalExpense = 0;
                let totalQuantity = 0;
                for (let purchase of result) {
                    if (proName == purchase.productName) {
                        totalExpense += purchase.totalPrice;
                        totalQuantity += purchase.purchasedQuantity;
                    }
                }
                expensePerProduct = totalExpense / totalQuantity;
                return expensePerProduct;
            })
            .catch(err => console.log("Error: " + err));
    }

Я новичок в stackoverflow (и в JS), поэтому скажите мне, если вам нужна дополнительная информация ..

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

С async_function документация:

Объявление асинхронной функции определяет асинхронную функцию, которая возвращает объект AsyncFunction.Асинхронная функция - это функция, которая работает асинхронно через цикл обработки событий, используя неявный Promise для возврата своего результата.

Это означает, что вам нужно использовать await, допустимо только внутри асинхронных функций, или then, чтобы получить значение, с которым было выполнено обещание.

Также обратите внимание, что вы ничего не возвращаете, поэтому обещание разрешается с помощью undefined "немедленно" (не совсем верно, но проще выразить этопуть), потому что ваша функция не содержит выражения await.

Попробуйте что-то вроде этого:

// Using native promises:
const calculateExpense = function (proName) {
    return fetch('/purchase')
        .then((response) => {
            if (response.status >= 400) { throw new Error(response.status.toString()); }

            const result = response.json();

            let totalExpense = 0;
            let totalQuantity = 0;

            for (let purchase of result) {
                if (proName === purchase.productName) {
                    totalExpense += purchase.totalPrice;
                    totalQuantity += purchase.purchasedQuantity;
                }
            }

            return totalExpense / totalQuantity;
        });
};

// Using async/await:
const calculateExpense = async function (proName) {
    const response = await fetch('/purchase');

    if (response.status >= 400) { throw new Error(response.status.toString()); }

    const result = response.json();

    let totalExpense = 0;
    let totalQuantity = 0;

    for (let purchase of result) {
        if (proName === purchase.productName) {
            totalExpense += purchase.totalPrice;
            totalQuantity += purchase.purchasedQuantity;
        }
    }

    return totalExpense / totalQuantity;
};

calculateExpense('name')
    .then((expensePerProduct) => {
        // TODO: do something.
    })
    .catch(err => console.log(`Error: ${err}`));
0 голосов
/ 04 декабря 2018

Поскольку вы используете async (но без await), я бы разделил этот код на пару функций и использовал await, чтобы упростить обработку обещаний.

1) Новая getData функция.

2) Уменьшенная calculateExpense функция.

async function getData(endpoint) {
  try {
    const res = await fetch(endpoint);
    if (res.status !== 200) throw new Error('Data error');
    return await res.json();
  } catch (e) {
    console.log(e);
  }
}

async function calculateExpense() {
  const data = await getData('/purchase');
  let totalExpense = 0;
  let totalQuantity = 0;
  for (let purchase of data) {
     if (proName == purchase.productName) {
       totalExpense += purchase.totalPrice;
       totalQuantity += purchase.purchasedQuantity;
     }
   }
   return totalExpense / totalQuantity;
}

calculateExpense().then(result => console.log(result));

Я добавил рабочую копию (с функцией фиктивной выборки) в jsFiddle .

...