Я новичок в 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 (mongoose findone) я вижу, что он возвращает обратный вызов. Но чтобы использовать await, мне нужно обещание. Я тоже использовал это, но это сработало!
хорошо, теперь я удалил обратный вызов, он работает хорошо, только с обещанием. Так что я тоже редактирую вопрос. Спасибо!
После редактирования код выглядит немного проще, НО моя основная проблема состоит в том, что я вынужден писать весь последующий код в anotherfunction (), я все еще там.
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
с нужными им значениями.
findOne
возвращаетPromise
или использует обратный вызов? Вероятно, он не делает и того, и другого - либо обрабатывает его какPromise
, либо передает обратный вызов, но не смешивает их.