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
 
     
    