С помощью этого сайта я создал две функции, из которых должен возвращаться комбинированный массив с некоторыми данными в нем. Все еще изучаю обещания jquery +, поэтому ответ с некоторыми объяснениями очень ценится.
В конечном итоге я хочу показать дату доставки для некоторых вариантов продукта с самой последней / последней датой поставки, если в корзине несколько товаров.
Идея состоит в том, что существует массив A, созданный с некоторыми продуктами. Затем я получаю некоторые данные JSON от продуктов в этом массиве A. В-третьих, существует новый массив B, созданный с совпадающими данными из функции getJson, который сплющил / объединил в один массив с несколькими объектами (в зависимости от количества подходящих продуктов вне поля зрения). В конечном итоге этот массив 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")
});
1023 *
Я просто не могу понять, почему! Я полностью застрял: (
Любая помощь с благодарностью!