Ich habe eine Promise-Funktion (using bluebird)
namens getBasketObject
erstellt. Diese Funktion erwartet einen Korb als Argument und gibt dann einen neuen basketObject
daraus zurück.So rufen Sie Promise-Funktion in Schleife und speichern Sie den Rückgabewert
basketObject
hat einige Variablen wie tax, total, shipping
und productItems
. Das Objekt productItems verfügt jetzt über price, name, quantity
verfügbare Eigenschaften, aber productImageLink
ist nicht verfügbar.
Um productImageLink
zu bekommen, mache ich einen neuen Async-Aufruf an einen Endpunkt, der mir das Produktbilder-Objekt holt. Image Endpoint
ist auch als ein Versprechen implementiert.
Nun, ich Schleife über die productLineItems
und erhalten Sie den Wert von Attributen wie name, price, quantity
und schließlich den Aufruf zum Bild zu machen.
Nun, wenn ich
basketObj["products"][productId]["productImageSrc"] = smallImage[0];
mein Objekt hinzufügen, wird nie geändert und in der endgültigen Ausgabe ich nicht Bild Link.
Dies passiert, weil mein getBasketObject
Wert zurückgegeben, bevor der Async-Aufruf aufgetreten ist. Um dies anzugehen, habe ich resolve(basketObj);
hinzugefügt, aber das kehrt sofort zurück und bin aus der Schleife.
Also, was ist der richtige Weg, um meine Produkt-Artikel zu durchlaufen und Bild-Links für alle Produkte zu erhalten.
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
});
}
});
};
Wenn ich resolve(basketObject)
mein letztes Objekt verwenden sieht aus wie
{
"total": 95.99,
"tax": "N/A",
"shipping": "N/A",
"products": {
"701642890706": {
"productQuantity": 1,
"productName": "Novelty Stitch Belted Cardigan",
"productPrice": 95.99,
"productImageSrc": "image.png"
}
}
}
Sie sehen es auch nur ein einziges Produkt Objekt erhält, wenn productLineItems
mehrere Produkte
Ist 'productLineItems' oder ein Objekt macht? Die Verwendung einer 'for in'-Schleife zeigt an, dass es sich nicht um ein Array handelt, aber weil Sie es' index' nennen und nicht 'key', sieht es so aus, als wäre es ein Array. –
@ t.niese: Es ist ein Objekt, ich habe es korrigiert, um Schlüssel zu verwenden, um Verwirrung zu vermeiden. Danke – RanRag