为什么此异步功能无法返回任何数据?

时间:2018-07-20 01:00:06

标签: javascript node.js loops asynchronous

因此,快速浏览一下,此功能是一个较大应用程序的一部分,该应用程序提取JSON数据并准备将其由Handlebars呈现,然后将其用于生成PDF。这个特定的功能让我感到悲伤,因为从我对异步/等待的工作方式的理解来看,数据应该由该功能底部的return returnArray返回。但是,这不会发生,而是返回空数组。谁能提供这方面原因的见解? (注:我已经检查了iarr中的数据在被推送时是否存在,就好像在for循环开始之前就已经触发了return语句。)

async function getPackageItem(item) {
  try {
    let returnArray = []
    if (fs.existsSync(__dirname + "/../json/" + item.sku + ".json")) {
      var file = fs.readFileSync(__dirname + "/../json/" + item.sku + ".json")
    } else {
      var file = fs.readFileSync(__dirname + "/../json/box.json")
    }
    const tb = JSON.parse(file);
    for (var a = 0; a < item.quantity; a++) {
      let iarr = [];
      if (tb) {
        tb.forEach(function(entry) {
          ShopifyAuth.get('/admin/products/' + entry.product_id + '.json', (err, productData) => {
            if (!err) {
              ShopifyAuth.get('/admin/products/' + entry.product_id + '/metafields.json', (err, metafieldData) => {
                if (!err) {
                  var itemObject = {};
                  var metaCounter = 0;
                  metafieldData.metafields.forEach(function(metadata) {
                    switch(metadata.key) {
                      case "notes": {
                        itemObject.wm_notes = metadata.value;
                        metaCounter++
                        break;
                      }
                      case "title": {
                        itemObject.title = metadata.value;
                        metaCounter++
                        break;
                      }
                      case "vintage": {
                        itemObject.year = metadata.value;
                        metaCounter++;
                        break;
                      }
                      case "shelfid": {
                        itemObject.shelf_id = metadata.value;
                        metaCounter++;
                        break;
                      }
                      case "bottleprice": {
                        itemObject.bottle_price = metadata.value;
                        metaCounter++;
                        break;
                      }
                      default: {
                        metaCounter++;
                        break;
                      }
                    }
                    if(metaCounter === metafieldData.metafields.length) {
                      itemObject.vendor = productData.product.vendor;
                      if (itemObject.title == undefined) {
                        itemObject.title = productData.product.title
                      }
                      if (itemObject.wm_notes == undefined) {
                        itemObject.wm_notes = " "
                      }
                      if (itemObject.year == undefined) {
                        itemObject.year = "Unspecified"
                      }
                      if (itemObject.shelf_id == undefined) {
                        itemObject.shelf_id = "N/A"
                      }
                      if (productData.product.images[1] == undefined) {
                        if (productData.product.images[0]) {
                          itemObject.logo = productData.product.images[0].src;
                        } else {
                          itemObject.logo = '';
                        };
                      } else {
                        itemObject.logo = productData.product.images[1].src;
                      }
                      itemObject.quantity = item.quantity;
                      iarr.push(itemObject)
                      if(iarr.length == tb.length) {
                        returnArray.push(iarr);
                      }
                    }
                  });
                } else {
                  throw Error('Error retrieving product metadata');
                }
              })
            } else {
              throw Error('Error retrieving product data');
            }
          })
        })
      } else {
        throw Error('Error loading JSON for specified box');
      }
    }
    return returnArray;
  } catch (e) {
    console.log(e)
  }
}

编辑:这就是我凌晨3点编写代码所获得的,不确定我是如何错过的。感谢您的反馈。

1 个答案:

答案 0 :(得分:1)

您已将函数boards标记为async,但您并未在函数内的任何地方使用await,因此您不会获得使用async的任何好处。它并不能使您的功能神奇地同步,您仍然必须仔细管理异步性。

如果ShopifyAuth.get支持返回承诺,则对结果进行await而不是传递回调,您的代码将起作用,否则构造一个Promise,在promise中执行异步操作,然后从功能。

async function getPackageItem(item) {
  let result = new Promise((resolve, reject) => {
    // all your ShopifyAuth stuff here
    if (err) {
      reject(err);
    }
    resolve(returnArray);
  });
  return result;
}