这是关于如何处理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()
放在我的文件顶部并不能真正解决问题,因为这只会被评估一次,而且只会评估一次。
人们如何解决这个问题?
答案 0 :(得分:0)
您可以导入该函数并在代码中将其命名为async:
{{1}}
这样就可以在每次通话时检查超时
答案 1 :(得分:0)
导出一个函数,并在实际需要访问数据时调用它,而不是在模块顶部调用。