I have created a promise function(using bluebird)
called getBasketObject
. This function expects a basket as an argument and than return a new basketObject
out of it.
basketObject
has some variables like tax, total, shipping
and productItems
. Now, the productItems object has price, name, quantity
properties available in it but it doesn't have productImageLink
available.
In order to get productImageLink
I make a new async call to an endpoint which will get me the product images object. Image Endpoint
is also implemented as a Promise.
Now, I loop over the productLineItems
and get the value of attributes like name, price, quantity
and finally make the call to get image.
Now, if I add
basketObj["products"][productId]["productImageSrc"] = smallImage[0];
my object is never modified and in the final output I don't get image link.
This happens because my getBasketObject
returned value before the async call happened. In order to tackle this I added resolve(basketObj);
but this returns immediately and am out of the loop.
So, what is the correct way to loop over my product items and get image links for all the products.
exports.getBasketObject = function(basket) {
return new Promise(function(resolve, reject){
if (!basket){
reject("Please give valid basket");
}
var basketObj = {};
if ('order_total' in basket && basket.order_total) {
basketObj.total = basket.order_total;
} else if ('product_total' in basket && basket.product_total) {
basketObj.total = basket.product_total;
}
var productLineItems = basket.product_items;
basketObj["products"] = {};
for (var key in productLineItems) {
var productItem = productLineItems[key];
var productId = productItem.product_id;
//Async call to get Product Object
product.getProductObject(productId).then(function(productObj){
basketObj["products"][productId] = {};
basketObj["products"][productId]['productQuantity'] = productItem.quantity;
basketObj["products"][productId]["productName"] = productItem.item_text;
basketObj["products"][productId]["productPrice"] = productItem.base_price;
//If promise resolved, get images
var imageObject = product.getProductImages(productObj[0]);
var smallImage = imageObject['small'];
basketObj["products"][productId]["productImageSrc"] = smallImage[0];
resolve(basketObj); //Acts as a return
});
}
});
};
If I use resolve(basketObject)
my final Object looks like
{
"total": 95.99,
"tax": "N/A",
"shipping": "N/A",
"products": {
"701642890706": {
"productQuantity": 1,
"productName": "Novelty Stitch Belted Cardigan",
"productPrice": 95.99,
"productImageSrc": "image.png"
}
}
}
You can see it gets only one product object even if productLineItems
has multiple products