在此站点的帮助下,我创建了两个函数,组合后的数组应在其中返回一些数据。仍在学习jQuery + Promise,因此非常感谢给出一些解释的答案。
如果购物车中有多个产品,我最终希望显示某些产品变型的交货日期以及最新/最后的交货日期。
想法是创建一个数组A,其中包含一些产品。接下来,我从数组A中的产品中获取一些JSON数据。第三,使用getJson函数中的匹配数据创建了一个新的数组B,该数组被展平/合并为具有多个对象的单个数组(取决于匹配产品的数量)。最终,此数组B被发送到另一个功能,该功能设置购物车中客户的交货时间。
假设购物车中有两种产品,例如:
<div class="prod" data-pid="41853029" data-vid="79380299" data-qty="1">....<div>
<div class="prod" data-pid="41853029" data-vid="79380296" data-qty="3">....<div>
然后我用这两个产品的数据创建一个数组,如下所示:
function getAllItems() {
var promiseArray = $('.prod').map(function() {
var item = {
id: $(this).data('pid'),
amt: $(this).data('qty'),
vid: $(this).data('vid'),
url: 'https://link-to-supplier/stock/'+$(this).data('pid')+'?secret=secret&quantity='+$(this).data('qty')
};
// return promise from getItemData()
/* console.log(getItemData(item)) returns =>
Object { id: 41853029, amt: 1, vid: 79380299, url: "correct link" }
Object { state: state(), always: always(), then: then(), promise: promise(), pipe: then(), done: add(), fail: add(), progress: add() }
Object { id: 41853029, amt: 1, vid: 79380299, url: "correct link" }
Object { id: 41853029, amt: 3, vid: 79380296, url: "correct link" }
Object { state: state(), always: always(), then: then(), promise: promise(), pipe: then(), done: add(), fail: add(), progress: add()}
Object { id: 41853029, amt: 3, vid: 79380296, url: "correct link" }
*/
return getItemData(item);
}).get();
/* console.log(promiseArray) returns =>
(2) […]
0: Object { state: state(), always: always(), then: then(), … }
1: Object { state: state(), always: always(), then: then(), … }
*/
// return promise
return Promise.all(promiseArray).then(function(res){
// flatten all the sub arrays produced in getItemData()
return [].concat.apply([], res)
})
}
在此函数中创建的数组将转到另一个函数getItemData()
,该函数应从getJSON调用返回具有匹配数据的新数组,如下所示:
function getItemData(item) {
/* console.log(item) returns =>
{
"id": 41853029,
"amt": 1,
"vid": 79380299,
"url": "correct link"
} etc...
*/
// return single item request promise
return $.getJSON(item.url).then(function(data) {
// filter and map the response data required
return Object.values(data.variants).filter(function(variant) {
variant.id == item.vid
}).map(function(variant) {
return {
id: variant.id,
dt: Number(variant.deliveryTimeInDays),
dtt: variant.deliveryTime,
co: variant.cutOffTime,
sid: variant.supplier_id
}
});
});
}
Json数据:
{
"id": 41853029,
"variants": {
"79380290": {
"id": 79380290,
"supplier_id": 5,
"on_stock": "no",
"levelLocal": 0,
"levelSupplier": 0,
"deliveryTime": "out of stock",
"cutOffTime": "15:00",
"deliveryTimeInDays": -1
},
"79380293": {
"id": 79380293,
"supplier_id": 5,
"on_stock": "no",
"levelLocal": 0,
"levelSupplier": 0,
"deliveryTime": "out of stock",
"cutOffTime": "15:00",
"deliveryTimeInDays": -1
},
"79380296": {
"id": 79380296,
"supplier_id": 5,
"on_stock": "supplier",
"levelLocal": 1,
"levelSupplier": 250,
"deliveryTime": "Three days",
"cutOffTime": "15:00",
"deliveryTimeInDays": 3
},
"79380299": {
"id": 79380299,
"supplier_id": 5,
"on_stock": "supplier",
"levelLocal": 2,
"levelSupplier": 250,
"deliveryTime": "One day",
"cutOffTime": "15:00",
"deliveryTimeInDays": 1
}
}
}
接下来,当我调用该函数并执行console.log(res)时,它将返回一个空数组。
getAllItems().then(function(res){
// all requests have completed and res is combined results
console.log(res);
}).catch(function(){
console.log("One of the requests failed")
});
我只是不知道为什么!我完全被卡住了:(
任何帮助都将不胜感激!