Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JQuery/Javascript-解析多个承诺_Javascript_Jquery_Loops_Sdk_Promise - Fatal编程技术网

JQuery/Javascript-解析多个承诺

JQuery/Javascript-解析多个承诺,javascript,jquery,loops,sdk,promise,Javascript,Jquery,Loops,Sdk,Promise,花了一整天的时间想弄明白这一点,但进展很快 基本上,我需要在购物车项目数组中循环并提取产品ID。一旦我这样做了,我就可以使用ID在我的服务器上搜索产品数组,并调用正确的产品 一旦我能够在我的服务器上找到所需的产品,我想找到零库存的产品 这就是我到目前为止所做的: var getLatestProducts = function () { var dfd = new $.Deferred(), productId; // loop through array

花了一整天的时间想弄明白这一点,但进展很快

基本上,我需要在购物车项目数组中循环并提取产品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');
    }
  });
这是我在控制台中得到的结果。如何在这两个对象之间循环


我不完全熟悉你在做什么,但你似乎多次解决承诺,这可能只在第一次起作用。相反,您应该尝试对每个请求使用一个承诺,将这些承诺收集在一个“父”承诺中,然后在
getLatestProducts
中返回这一承诺。只有当所有子承诺都得到解决时,这个承诺才应该得到解决

您可以尝试一下,但我无法测试,而且我不熟悉JQuery的承诺,因此我不能保证这会起作用。希望它仍然对你有帮助!:)


我并不完全熟悉你在做什么,但似乎你在多次解决承诺,这可能只在第一次起作用。相反,您应该尝试对每个请求使用一个承诺,将这些承诺收集在一个“父”承诺中,然后在
getLatestProducts
中返回这一承诺。只有当所有子承诺都得到解决时,这个承诺才应该得到解决

您可以尝试一下,但我无法测试,而且我不熟悉JQuery的承诺,因此我不能保证这会起作用。希望它仍然对你有帮助!:)



请在代码中添加更多注释,它仍然非常模糊,因为没有解释服务器返回的数据类型。抱歉,伙计,数据是JSON哪个部分不工作…?“Promise.done”仅显示数组中的一个结果。老实说,我不确定我是否用了正确的方法请在代码中添加更多注释,它仍然非常模糊,因为没有解释服务器返回的数据类型。抱歉,伙计,数据是JSON哪部分不工作…?“Promise.done”只显示数组中的一个结果。老实说,我不确定我是否以正确的方式处理了这个问题是的,我认为你是对的。我将如何处理这个问题?我更新了我的答案。希望这对你有帮助。正如我也说过的,我不熟悉jQueryPromiseAPI,所以这可能不起作用。它可能会让你知道你需要做什么:)整理了一些错误,它似乎在工作,但这不起作用:products.forEach(function(product){});您应该在调试器中检查该上下文中的数据类型产品。您可能希望它是一个数组。但是,我的答案中的这一部分不是必需的,您也可以使用for循环遍历此数组,或者以您喜欢的方式遍历,或者以完全不同的方式处理数据。promise.done并不是显示一个包含对象的数组,它只是显示对象。我想你是对的。我将如何处理这个问题?我更新了我的答案。希望这对你有帮助。正如我也说过的,我不熟悉jQueryPromiseAPI,所以这可能不起作用。它可能会让你知道你需要做什么:)整理了一些错误,它似乎在工作,但这不起作用:products.forEach(function(product){});您应该在调试器中检查该上下文中的数据类型产品。您可能希望它是一个数组。但是,我的答案中的这一部分不是必需的,您也可以使用for循环遍历此数组,或者以您喜欢的方式遍历,或者以完全不同的方式处理数据。promise.done并没有显示包含对象的数组,它只是显示对象
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
  });
}