Массив Promise возвращает пустой - PullRequest
0 голосов
/ 08 апреля 2019

С помощью этого сайта я создал две функции, из которых должен возвращаться комбинированный массив с некоторыми данными в нем. Все еще изучаю обещания 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 *

Я просто не могу понять, почему! Я полностью застрял: (

Любая помощь с благодарностью!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...