导出动态内容的ES6模块?

时间:2018-05-09 15:21:46

标签: javascript asynchronous dependency-injection ecmascript-6 promise

这是关于如何处理API中数据依赖性转移的一般性问题。

我依赖于我的应用程序中的两个数据对象:

1. mycompanyProducts
2. mycompanySettings

产品对象如下:

{
  "MYTHING01": {
    "sku": "MYTHING01",
    "name": "15-Pack",
    "price": 30,
    "shopifyData": {
      "id": "7987037995068",
      "product_id": "664292996940",
      "price": "30.00",
      "taxable": true,
      "inventory_quantity": 10,
      "weight": 2,
      "weight_unit": "kg",
      "lastFetched": {
        "$date": "2018-05-09T14:16:57.209Z"
      }
    }
  },
  "MYTHING02": {
    "sku": "MYTHING02",
    "name": "5-Pack",
    "price": 15,
    "shopifyData": {
      "id": "7836960168028",
      "product_id": "645959671756",
      "price": "15.00",
      "taxable": true,
      "inventory_quantity": 10,
      "weight": 2,
      "weight_unit": "kg",
      "lastFetched": {
        "$date": "2018-05-09T14:16:57.228Z"
      }
    }
  }
}

设置对象只包含应用程序设置,例如以MB为单位的最大图像上传大小等。

这两个对象都来自MongoDb集合。

以下是我的想法:我希望能够更新我的集合,让我的API更新其依赖项,而无需重建。基于Shopify webhooks(其中一些更改来自)等触发API重建将非常麻烦。

每个产品都有一个shopifyData.lastFetched时间戳,当访问数据时,如果时间戳超过过去的某个时间段(10分钟),我想在继续之前刷新数据:

// Loop through each Shopify product and update the product in the db
await Promise.all(res.data.products.map(async (shopifyProduct) => {
  const variant = shopifyProduct.variants.find(v => mySKUs.includes(v.sku))
  product.shopifyData = {
    ...variant,
    lastFetched: new Date(),
  }
  await product.save()
}))

问题是:如何构建我的API以使用更新依赖项?显然ES6模块是静态导出的,在重建应用程序之前不会改变。

我当然可以导出一个返回依赖项的函数,并在我需要它时为新鲜的deps调用这个函数,但问题是我的函数必然是async,所以打电话很难:

import React from 'react'
const deps = generateDeps() // can't use await in this scope...

此外,将const deps = generateDeps()放在我的文件顶部并不能真正解决问题,因为这只会被评估一次,而且只会评估一次。

人们如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

您可以导入该函数并在代码中将其命名为async:

{{1}}

这样就可以在每次通话时检查超时

答案 1 :(得分:0)

导出一个函数,并在实际需要访问数据时调用它,而不是在模块顶部调用。