Модуль ES6, который экспортирует динамический контент? - PullRequest
0 голосов
/ 09 мая 2018

Это общий вопрос о том, как бороться со сдвигом зависимостей данных в 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"
      }
    }
  }
}

А объект настроек просто содержит настройки приложения, такие как максимальный размер загружаемого изображения в МБ и т. Д.

Оба эти объекта происходят из коллекций MongoDb.

Вот идея: я хочу иметь возможность обновлять свои коллекции, и чтобы мой API обновлял свои зависимости без необходимости перестраивать. Было бы очень обременительно запускать перестройки API на основе веб-заездов Shopify (откуда происходят некоторые изменения) и т. Д.

Каждый продукт имеет отметку времени 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 экспортируются статически и не изменятся, пока приложение не будет перестроено.

Я, конечно, могу экспортировать функцию , которая возвращает зависимости, и вызывать эту функцию, когда она мне нужна для свежих операций, но проблема в том, что моя функция обязательно async, поэтому трудно по телефону:

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

Более того, размещение const deps = generateDeps() в верхней части моих файлов на самом деле не решает проблему, так как это будет оценено один раз и только один раз.

Как люди решают эту проблему?

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

Экспортируйте функцию и вызывайте ее всякий раз, когда вам действительно нужен доступ к данным, а не вверху модуля.

0 голосов
/ 09 мая 2018

Вы можете импортировать функцию и вызывать ее асинхронно в вашем коде:

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

Таким образом, тайм-аут будет проверяться при каждом вызове

...