Я создал функцию обещания (using bluebird)
под названием getBasketObject
. Эта функция ожидает корзину в качестве аргумента, а не возвращает новый basketObject
.Как вызвать функцию Promise в цикле и сохранить возвращаемое значение
basketObject
имеет некоторые переменные, такие как tax, total, shipping
и productItems
. Теперь объект productItems имеет price, name, quantity
свойств, доступных в нем, но у него нет productImageLink
.
Для получения productImageLink
Я делаю новый асинхронный вызов к конечной точке, которая доставит мне объект изображений продукта. Image Endpoint
также реализуется как обещание.
Теперь я перехожу через productLineItems
и получаю значение атрибутов, например name, price, quantity
, и, наконец, сделаю звонок, чтобы получить изображение.
Теперь, если добавить
basketObj["products"][productId]["productImageSrc"] = smallImage[0];
мой объект никогда не модифицирована и в конечном выходе я не получаю ссылку на изображение.
Это происходит потому, что мое getBasketObject
вернуло значение перед асинхронным вызовом. Чтобы решить эту проблему, я добавил resolve(basketObj);
, но это немедленно возвращается, и я вышел из цикла.
Итак, каков правильный способ перебора элементов продукта и получения ссылок на изображения для всех продуктов.
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
});
}
});
};
Если я использую resolve(basketObject)
мой последний объект выглядит
{
"total": 95.99,
"tax": "N/A",
"shipping": "N/A",
"products": {
"701642890706": {
"productQuantity": 1,
"productName": "Novelty Stitch Belted Cardigan",
"productPrice": 95.99,
"productImageSrc": "image.png"
}
}
}
Вы можете видеть, что получает только один объект продукта, даже если productLineItems
имеет несколько продуктов
ли 'productLineItems' массив или объект? Использование цикла 'for in' указывает, что это не массив, а потому, что вы называете его' index', а не 'key' выглядит так, как будто это массив. –
@ t.niese: Его объект, я исправил его, чтобы использовать «ключ», чтобы избежать путаницы. Спасибо – RanRag