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

希尔顿

因此,快速浏览一下,此功能是大型应用程序的一部分,该应用程序提取JSON数据并将其准备好由Handlebars呈现,然后将其用于生成PDF。这个特定的功能让我感到悲伤,因为从我对async / await的工作方式的理解来看,数据应该由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点编写代码所获得的,不确定我是如何错过的。感谢您的反馈意见。

椒盐脆饼

您已标记了功能,async但未在其中使用await任何功能,因此无法获得使用的任何好处async它并不能使您的功能神奇地同步,您仍然必须谨慎地管理异步性。

如果ShopifyAuth.get支持返回承诺,则await在结果上而不是传递回调,您的代码将起作用,否则构造一个Promise,在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;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章