Определенная путаница при написании асинхронной функции. Кто-нибудь может подтвердить?

Я новичок в NodeJS. Я пытался написать функцию, которая может просто возвращать значение конфигурации из БД. Возможно, мне придется звонить несколько раз.

На PHP или других синхронных языках я бы использовал для этого следующий код

function getConfigValue($configKeyName)
{

// DB READ OPERATIONS

return $confguration_value_fetched_from_db

}

getConfigValue("key1");
getConfigValue("key2");

так далее

Но в NodeJS мне было слишком сложно выполнить эту операцию из-за асинхронного характера кода. Задав здесь несколько вопросов и потратив часы на изучение ключевых слов Callbacks, Promises, Async / await, я, будучи новичком, представил лучший код, который я смог достичь.

    // Below function defines the 'get' function

            var get = async (key) => {

              var result = await COLLECTIONNAME.findOne({key}); //MongoDB in backend

              return result.value;

            }

        // Here I am forced to define another async function so that I can await for the get function.

            function async anotherfunction()
            {

            var value_I_am_lookingfor1 = await get("key1");

            var value_I_am_lookingfor2 = await get("key2");

            }

            anotherfunction();

Хотя это может сработать, я не полностью доволен результатом, главным образом потому, что я действительно не хочу выполнять все мое дальнейшее кодирование на основе полученного значения в этой функции anotherfunction (). Все, что я хочу, это получить одно значение? Также мне может потребоваться легко вызвать его из многих мест в приложении, а не только отсюда (я планировал разместить его в модуле)

Есть лучшие или более простые методы? Или я должен всегда получать желаемое значение, а затем вставлять его с помощью «затем». делать последующую операцию? Я даже сомневаюсь, что фундаментальный подход, который я использую к кодированию NodeJS, может быть неправильным.

Кто-нибудь может направить меня?

findOne возвращает Promise или использует обратный вызов? Вероятно, он не делает и того, и другого - либо обрабатывает его как Promise, либо передает обратный вызов, но не смешивает их.

CertainPerformance 13.09.2018 08:47

В документации findOne (mongoose findone) я вижу, что он возвращает обратный вызов. Но чтобы использовать await, мне нужно обещание. Я тоже использовал это, но это сработало!

Jab2Tech 13.09.2018 08:50

хорошо, теперь я удалил обратный вызов, он работает хорошо, только с обещанием. Так что я тоже редактирую вопрос. Спасибо!

Jab2Tech 13.09.2018 08:52

После редактирования код выглядит немного проще, НО моя основная проблема состоит в том, что я вынужден писать весь последующий код в anotherfunction (), я все еще там.

Jab2Tech 13.09.2018 08:53
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
4
48
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

mainly because I really don't want to do all my further coding based on the fetched value within this function anotherfunction(). All I want is to fetch a single value?

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

Also I might need to easily call it from many places within the application, not just from here (I was planning to place it in a module)

Этот модуль должен выполнять запросы и экспортировать обещание, которое разрешает требуемые значения. Вместо использования await (который заставляет обрабатывать запросы в сериале) вам, вероятно, следует использовать Promise.all, который позволит отправлять несколько запросов одновременно. Например:

valuegetter.js

const get = key => COLLECTIONNAME.findOne({ key }).then(res => res.value);
export default Promise.all([
  get('key1'),
  get('key2')
]);

main.js

import prom from './valuegetter.js';
prom.then(([val1, val2]) => {
  // do stuff with val1 and val2
})
.catch((err) => {
  // handle errors
});

Если другим модулям нужны val1 и val2, вызовите их из main.js с нужными им значениями.

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