我如何从诺言中返回一个数字?

时间:2018-12-04 17:07:50

标签: javascript api promise return-value

我试图返回一个数字(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)的新手,所以请告诉我是否需要更多信息。

2 个答案:

答案 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