2016-08-16 162 views
1

花了整整一天的時間試圖找出這一點,但無法快速完成任務。JQuery/Javascript - 解決多個承諾

基本上我需要通過一系列購物車項目進行循環,並提取產品ID。完成之後,我可以使用ID在我的服務器上搜索一系列產品,並調用正確的產品。

一旦我能夠在我的服務器上找到所需的產品,我想查找具有零庫存的產品。

這是我到目前爲止有:

var getLatestProducts = function() { 
    var dfd = new $.Deferred(), 
     productId; 

    // loop through array (json) 
    for (var i in cart.contents) { 

     productId = cart.contents[i].id; 

     console.log(productId); 

     // SDK to get desired products from server 
     moltin.Product.Get(productId, function(product) { 
     dfd.resolve(product.stock_level); 
     }); 
    } 
    return dfd.promise(); 
    }; 

    var promise = getLatestProducts(); 

    promise.done(function(result) { 
    var stockLevel = result; 

    if (stockLevel > 0) { 
     console.log('go to checkout'); 
    } else { 
     console.log('show alert to stop going through to checkout'); 
    } 
    }); 

這是我在我的控制檯得到的結果。我如何循環訪問這兩個對象?

enter image description here

+0

請在代碼中添加更多註釋,它仍然非常模糊,因爲沒有解釋您的服務器返回的數據類型。 –

+0

對不起fella,數據是JSON – Richy

+0

哪部分不工作...? – Hodrobond

回答

0

我不完全熟悉,你在做什麼,但似乎你解決的承諾多次,這大概只能是第一次。您應該嘗試爲每個請求使用一個承諾,將這些承諾彙總在一個「父」承諾中,然後在getLatestProducts中返回這一個承諾。這個承諾只有在所有的孩子承諾都得到解決後才能解決。

你可以試試這個,但我可以'測試這個,我不熟悉JQuery的承諾所以我不能保證這將工作。希望它仍然可以幫助你! :)

var getLatestProducts = function() { 
    var dfd = new $.Deferred(); 
    var productIds = []; 
    var products = []; 

    for (var i in cart.contents) { 
    productIds.push(cart.contents[i].id); 
    } 

    var promises = $.map(productIds, function(productId, idx) { 
     return moltin.Product.Get(productId, function(product) { 
      products.push(product); 
     }); 
    } 
    $.when.apply($, promises).then(function() { 
     dfd.resolve(products); 
    } 
    return dfd.promise(); 
}; 

var promise = getLatestProducts(); 

promise.done(function(result) { 
    var products = result; 

    products.forEach(function(product) { 
    // products should be an array of all products that were in the cart 
    // now filter those you want (stock level etc.) 
    // and do awesome stuff 
    }); 
} 
+0

是的,我認爲你是對的philmtd。我會如何處理這個問題? – Richy

+0

我更新了我的答案。希望這可以幫助你。正如我也說過的,我不熟悉JQuery諾言API,所以這可能不起作用。它可能會讓你知道你需要做什麼:) – philmtd

+0

收拾了一些錯誤,它似乎工作,但是這不是工作:products.forEach(function(product){}); – Richy