【问题标题】:JQuery/Javascript - Resolve multiple promisesJQuery/Javascript - 解决多个承诺
【发布时间】:2016-12-23 07:48:45
【问题描述】:

花了一整天的时间试图弄清楚这一点,但没有快速实现。

基本上,我需要遍历一系列购物车物品并提取产品 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');
    }
  });

这是我在控制台中得到的结果。如何循环遍历这 2 个对象?

标签: javascript jquery loops sdk promise


【解决方案1】:

我并不完全熟悉你在做什么,但似乎你正在多次解决承诺,这可能只在第一次有效。相反,您应该尝试为每个请求使用一个 Promise,将这些 Promise 收集到一个“父”Promise 中,然后在 getLatestProducts 中返回这个 Promise。只有当所有子 Promise 都已解决时,才应解决此 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
  });
}

【讨论】:

  • 是的,我认为你是对的 philmtd。我将如何处理这个问题?
  • 我更新了我的答案。希望这对您有所帮助。正如我也说过的,我不熟悉 JQuery promise API,所以这可能行不通。它可能会让你知道你需要做什么:)
  • 整理了一些错误,似乎可以正常工作,但这不起作用: products.forEach(function(product) {});
  • 您应该在调试器中检查该上下文中的数据类型产品是什么。您可能希望它是一个数组。但是,我的回答的那部分不是必需的,您也可以使用 for 循环遍历此数组,或者您喜欢或以完全其他方式处理数据。
  • 过去一个小时一直在看这个问题,但我无法解决它。 promise.done 不显示包含对象的数组,它只是显示对象
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-15
  • 2018-10-02
相关资源
最近更新 更多