getBasketObject
と呼ばれる約束関数(using bluebird)
を作成しました。この関数はバスケットを引数として期待し、新しいバスケットを返すよりも新しいbasketObject
を返します。ループ内のPromise関数の呼び出し方法とその戻り値の保存
basketObject
は、tax, total, shipping
およびproductItems
のようないくつかの変数を有する。今、productItemsオブジェクトにはprice, name, quantity
プロパティがありますが、利用可能なのはproductImageLink
ではありません。
productImageLink
私は製品イメージオブジェクトを取得するエンドポイントに新しい非同期呼び出しを行います。 Image Endpoint
もPromiseとして実装されています。
ここでは、productLineItems
をループし、name, price, quantity
のような属性の値を取得し、最後にget imageを呼び出します。
さて、私が追加した場合
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
は、すべてのresolve(basketObj)
の
呼び出しを行うのですか?してください'for 'ループの使用は配列ではなく、' key'を 'index'と呼び、' key'は配列のように見えないためです。 –
@ t.niese:そのオブジェクトで、混乱を避けるために 'key'を使うように修正しました。 Thanks – RanRag