我试图返回一个数字(expensePerProduct),我将使用该数字将数据“ PUT”到对象中,但是此函数返回的是Promise对象,而不仅仅是一个数字:(我在这里做什么?< / p>
这是我的代码:
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)的新手,所以请告诉我是否需要更多信息。
答案 0 :(得分:0)
当您使用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));
I've added a working copy (with a mocked fetch function) on jsFiddle。
答案 1 :(得分:0)
摘自async_function文档:
异步函数声明定义了一个异步函数,该函数 返回一个AsyncFunction对象。异步函数是 通过事件循环异步运行的函数,使用 隐式承诺返回其结果。
这意味着您需要使用await
(仅在异步函数内部有效),或使用then
来获取用于兑现承诺的值。
还请注意,您没有返回任何内容,因此使用undefined
“立即”解决了诺言(不是真的,但更容易这样说),因为您的函数不包含{{1 }}表达式。
尝试这样的事情:
await