我有一个异步函数,我在其中使用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()返回一个值,这样才能正常工作?
答案 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)