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

Я очень новичок в 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 может быть неправильным.

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

1 Ответ

0 голосов
/ 13 сентября 2018

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

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

Также мне может понадобиться легко вызывать его из многих мест внутри приложения, а не только отсюда (я планировал разместить его в модуле)

У вас должен быть этот модуль, чтобы делать запросы и экспортировать Обещание, которое разрешается до необходимых значений. Вместо использования 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 со значениями, которые им необходимы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...