Javascript 导出动态内容的ES6模块?

Javascript 导出动态内容的ES6模块?,javascript,asynchronous,dependency-injection,ecmascript-6,promise,Javascript,Asynchronous,Dependency Injection,Ecmascript 6,Promise,这是一个关于如何处理API中不断变化的数据依赖关系的一般性问题 我的应用程序依赖于两个数据对象: 1. mycompanyProducts 2. mycompanySettings products对象看起来像: { "MYTHING01": { "sku": "MYTHING01", "name": "15-Pack", "price": 30, "shopifyData": { "id": "7987037995068", "pr

这是一个关于如何处理API中不断变化的数据依赖关系的一般性问题

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

1. mycompanyProducts
2. mycompanySettings
products对象看起来像:

{
  "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更新其依赖项,而无需重建。必须触发基于ShopifyWebhooks(其中一些更改来自于ShopifyWebhooks)的API重建,这将非常麻烦

每个产品都有一个
ShopifData.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模块是静态导出的,在重新构建应用程序之前不会更改

当然,我可以导出一个返回依赖项的函数,并在我需要新的DEP时调用此函数,但问题是我的函数必须是
异步的
,因此很难调用:

import React from 'react'
const deps = generateDeps() // can't use await in this scope...
此外,将
const deps=generateDeps()
放在我的文件顶部并不能真正解决这个问题,因为这将被评估一次,而且只评估一次


人们是如何解决这个问题的?

您可以导入函数并在代码中调用它:

import {generateDeps} from './depsGenerator'
//...
generateDeps().then(() => {
    //...
})

这样,每次调用时都会检查超时

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

现在还不清楚为什么Shopify产品或集合的更新会更新您的项目依赖项。比如……更新一个产品意味着你需要在你的项目中加载一个新的、不同的npm模块?我问这个问题的原因是因为我直觉上觉得你遇到这个问题的原因是你首先构造了一些错误的东西。如果您只需要更新产品信息。。。这并不需要像您所要求的那样复杂的东西。您似乎已经将数据模型的概念、实际数据和对数据的访问合并到一个称为依赖关系的概念中。在您的场景中,实际上只有一种情况发生了变化,正如TKoL所指出的,更新数据不需要这么复杂。@RandyCasburn显然,更新数据是最简单的部分。想象一下,我改变了MYTHING02的体重。如果我的API的其他部分依赖于这个权重——想象一下端点的验证检查与权重的对比——这种变化将如何发生?没有必要居高临下。道歉——并不是故意这样的——看来你的两难处境已经过去了。解决方案从最简单的发布/订阅开始,到最复杂的反应式javascript(RxJS)风格。订阅更改的数据并通过自定义事件传播这些更改,或者观察数据并对更改作出反应。