JQuery/Javascript-解析多个承诺
花了一整天的时间想弄明白这一点,但进展很快 基本上,我需要在购物车项目数组中循环并提取产品ID。一旦我这样做了,我就可以使用ID在我的服务器上搜索产品数组,并调用正确的产品 一旦我能够在我的服务器上找到所需的产品,我想找到零库存的产品 这就是我到目前为止所做的: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
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
});
}