2017-12-13 4 views
0

オブジェクトを返すために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'のような静的な値で置き換えようとしましたが、オブジェクトが変更可能かどうかを確認しました。

これはなぜ機能しないのでしょうか?私はそれが非同期関数の中で起こっているこのすべてのものと何か関係があると思うが、私は本当に理由を理解することはできない。

functionController.read_product()が値を返すまで、関数の実行は停止されているはずなので、正しく動作するはずです。

+0

あなたは 'productController.calculate_product_price()投稿していなかった'そうだね – Pointy

+0

、私はそれを掲載しました。 :-) – NvdB31

+0

既に待っていて、製品のコンソールログをやりましたか? –

答えて

2

あなたは2 asyncの機能を持っています。あなたは両方を待つ必要があります。どこかにあなたのコードに...

console.log(myProducts, 7); 

を、そしてログは、それが空であることを示しています。私は、あなたがこのような何かをやっていると仮定しています。 createProductsArrayも非同期ですので、しかし、あなたはまた、awaitでそれをラップする必要があります。

await console.log(myProducts, 7); 
+0

ご協力ありがとうございます。私はすでに問題を解決しました(下記の私の答えを見てください)。 – NvdB31

0

それは私がマングースクエリから来たオブジェクトを変更しようとしていたことが判明しました。

しかし、MongooseはプレーンなJavascriptオブジェクトを返さないため、変更することはできません。私はMongooseクエリにlean()を追加することでそれを解決しました。この問題の

詳細情報:Why can't you modify the data returned by a Mongoose Query (ex: findById)

関連する問題