簡體   English   中英

JQuery / Javascript - 解決多個承諾

[英]JQuery/Javascript - Resolve multiple promises

花了一整天努力想象這一點,但無處可去。

基本上我需要遍歷一系列購物車項目並提取產品ID'S。 完成后,我可以使用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個對象?

在此輸入圖像描述

我並不完全熟悉你正在做的事情,但似乎你多次解決這個承諾,這可能只是第一次有效。 您應該嘗試為每個請求使用一個promise,在一個“父”promise中收集這些promise,然后在getLatestProducts返回這個promise。 只有在所有兒童承諾得到解決后,才能解決這一承諾。

你可以嘗試這個,但我可以'測試一下,我不熟悉JQuery Promises所以我不能保證這會工作 希望它仍然可以幫到你! :)

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM