2016-08-16 17 views
1

一日中これを理解しようとしましたが、どこも速くなりませんでした。JQuery/Javascript - 複数の約束を解決

基本的には、カートアイテムの配列をループして商品IDを引き出す必要があります。私がそれをしたら、IDを使ってサーバ上の製品の配列を検索し、正しいものを呼び出すことができます。

私のサーバー上で希望の製品を見つけることができたら、ZERO在庫のある製品を探したいと思います。

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'); 
    } 
    }); 

これは私が私のコンソールで取得していた結果である:

は、これは私がこれまで持っているものです。 2つのオブジェクトをどのようにループするのですか?

enter image description here

+0

サーバーに返されるデータの種類についての説明がないので、コードにはまだまだコメントが追加されています。 –

+0

ごめんなさい、データはJSONです – Richy

+0

どちらの部分が機能していません...? – Hodrobond

答えて

0

は、私が何をやっていると完全に慣れていないんだけど、あなたがおそらく唯一の最初の時間を働く約束を複数回、解決しているようです。代わりに、それぞれの要求に対して1つの約束を使用し、それらの約束を1つの「親」約束でまとめて、getLatestProductsにこの1つの約束を返してください。この約束は、すべての子供の約束が解決されたときにのみ解決されるべきです。

これを試すことができますが、私はこれをテストすることができ、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 promise APIに精通していないので、これはうまくいかないかもしれません。それはあなたに何をする必要があるかのアイデアを与えるかもしれません:) – philmtd

+0

いくつかの間違いを整理し、それは動作しているようですが、これは動作しません:products.forEach(function(product){}); – Richy

関連する問題