С 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}`));