承诺数组返回空

时间:2019-04-08 14:45:16

标签: javascript arrays json promise

在此站点的帮助下,我创建了两个函数,组合后的数组应在其中返回一些数据。仍在学习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")
});

我只是不知道为什么!我完全被卡住了:(

任何帮助都将不胜感激!

0 个答案:

没有答案