【发布时间】:2016-07-30 18:27:25
【问题描述】:
我创建了一个名为getBasketObject 的promise 函数(using bluebird)。此函数需要一个篮子作为参数,然后从中返回一个新的 basketObject。
basketObject 有一些变量,例如 tax, total, shipping 和 productItems。现在,productItems 对象中有price, name, quantity 可用的属性,但它没有productImageLink 可用。
为了获得productImageLink,我对端点进行了新的异步调用,该端点将为我获取产品图像对象。 Image Endpoint 也被实现为 Promise。
现在,我遍历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:它是一个对象,我将其更正为使用
key以避免混淆。谢谢
标签: javascript express promise nodes bluebird