Модуль загрузки данных из базы данных по требованию

Я пытаюсь создать модуль, который загружает категории из базы данных один раз, поэтому я могу запросить его с помощью categoryName, и он вернет модель. нравится эта категорияResolver('свитера'). Я использую возражение.js

В настоящее время у меня есть следующий код

'use strict'

const CategoryModel = require('./models/Category.js')
var categories

async function getCategories () {
  categories = await CategoryModel.query()
}

getCategories()

module.exports = function (categoryName) {    
  return (categories.filter(c => {
    return c.name === category
  }))
}

Как я могу убедиться, что категории были инициализированы перед запросом? Проверка того, были ли установлены категории, и ожидание, пока это не будет, кажется плохим решением.

Фильтр даст вам пустой массив переменных категорий, которые не были инициализированы.

Neeraj Wadhwa 22.05.2019 17:01
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Сравнение структур данных: Массивы и объекты в Javascript
Сравнение структур данных: Массивы и объекты в Javascript
Итак, вы изучили основы JavaScript и хотите перейти к изучению структур данных. Мотивация для изучения/понимания Структур данных может быть разной,...
Создание собственной системы электронной коммерции на базе Keystone.js - настройка среды и базовые модели
Создание собственной системы электронной коммерции на базе Keystone.js - настройка среды и базовые модели
Прошлая статья была первой из цикла статей о создании системы электронной коммерции с использованием Keystone.js, и она была посвящена главным образом...
Приложение для отслеживания бюджета на React js для начинающих
Приложение для отслеживания бюджета на React js для начинающих
Обучение на практике - это проверенная тема для достижения успеха в любой области. Если вы знаете контекст фразы "Практика делает человека...
Стоит ли использовать React в 2022 году?
Стоит ли использовать React в 2022 году?
В 2022 году мы все слышим о трендах фронтенда (React, Vue), но мы не знаем, почему мы должны использовать эти фреймворки, когда их использовать, а...
0
1
32
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Обновлено: добавлен демонстрационный фрагмент

Вы можете заставить свою функцию запроса ожидать вызова getCategories перед запуском фильтра.

// categories is a Promise
const categories = getCategories();

module.exports = async function (categoryName) {    
  return categories.then(cats => cats.filter(c => c.name === categoryName));
}

Обещание разрешится один раз, а затем будет практически мгновенно разрешено.

Затем внешние пользователи будут рассматривать возвращаемое значение как обещание, ожидая:

const sweaters = await categoryResolver('sweaters');
// do something with sweaters

или затем:

categoryResolver('sweaters')
  .then(sweaters => {
    // do something with sweaters
  });

В следующей демонстрации вы заметите, что первоначальное разрешение занимает 2 секунды, но последующие вызовы разрешаются немедленно.

// mock data
const data = [{
    name: 'sweaters',
    items: ['sweater 1', 'sweater 2', 'sweater 3']
  },
  {
    name: 'wookies',
    items: ['wookie 1', 'wookie 2', 'wookie 3']
  },
  {
    name: 'hats',
    items: ['hat 1', 'hat 2', 'hat 3']
  },
];

// simulated category fetch; waits 2 seconds and resolves with mock data
const categories = new Promise((resolve) => {
  setTimeout(() => resolve(data), 2000);
});

async function categoryResolver(category) {
  return categories.then(cats => cats.filter(c => c.name === category));
}

// usage with await
async function goAwait(category) {
  const cat = await categoryResolver(category);
  console.log(`awaited ${category}`, cat);
}

// usage with then
function goThen(category) {
  categoryResolver(category).then(cat => {
    console.log(`thenned ${category}`, cat);
  });
}

goAwait('sweaters');
goThen('sweaters');
goAwait('wookies');
goThen('hats');

Спасибо за ваш ответ, однако я получаю TypeError: (промежуточное значение). Я также удалил "}))"

J. Doe 22.05.2019 17:30

Упс. Я обновил свой ответ, чтобы исправить эту проблему. Я ждал а также тогда. Фиксированный.

ray hatfield 22.05.2019 17:40

Я добавил работающий демонстрационный фрагмент, который показывает оба варианта использования.

ray hatfield 22.05.2019 17:45

Другие вопросы по теме