无法在异步函数中分配对象属性

时间:2017-12-13 13:51:17

标签: javascript asynchronous

我有一个异步函数,我在其中使用await来返回一个对象。

async function createProductsArray(products, numberOfDays) {
if (!products) return [];

var productsArray = [];

for (var i = products.length - 1; i >= 0; i--) {
  var product = await productController.read_product(products[i]);

  if (product) {
    product.total_price = productController.calculate_product_price(product, numberOfDays);
    productsArray.push(product);
  }  
}

console.log(productsArray);
return productsArray;
}

函数calculate_product_price:

exports.calculate_product_price = function (product, days) {

  if (days && product.selling_type == 'rental') {
    return product.price * days;
  }
 else {
    return product.price;
 }

}

出于某种原因,我无法将属性total_price分配给产品。它不会出现在此函数的返回对象上。我已经尝试用像'test'这样的静态值替换属性值,并且我检查了对象是否可变(它是)。

为什么这不起作用的任何想法?我怀疑它与异步函数中发生的所有这些事情有关,但我无法弄清楚原因。

函数执行应该暂停,直到await productController.read_product()返回一个值,这样才能正常工作?

2 个答案:

答案 0 :(得分:2)

您有2个async个功能。你需要等待他们两个。我假设你正在做这样的事情:

console.log(myProducts, 7);

...代码中的某处,日志显示为空。但是你还需要将它包装在await中,因为createProductsArray也是异步的:

await console.log(myProducts, 7);

答案 1 :(得分:0)

事实证明我正在尝试修改来自Mongoose查询的对象。

然而,Mongoose并没有返回普通的Javascript对象,因此修改它们是不可能的。我通过在Mongoose查询中添加lean()来解决它。

此问题中的更多信息:Why can't you modify the data returned by a Mongoose Query (ex: findById)