@NZCoder

Как сначало находить пользователя а потом возвращать его?

Здравствуйте. я попробую супер кратко, я протестировал свой код и понял, что сначало функция которая по кукисам находит пользователя А ПОТОМ возвращает его, делает все наоборот, а мне надо возвращать переменную с пользователем только если он нашелся:
function getUser (req, res) {
        const cookies = req.cookies["account"]

        if(!cookies) {
            console.log("cookies is not defined", cookies)
        }
        else {
            const result = users.findOne(cookies, (err) => {
                if (err) { console.log("err: " ,err) }
            })

            if(result) {
                console.log("result: ", result)
                return result
            }
            else {console.log("result is not defined: ", result)}
        }
    }
  • Вопрос задан
  • 49 просмотров
Пригласить эксперта
Ответы на вопрос 1
Aetae
@Aetae
Тлен
Синхронно - никак.
Возврат из обычной функции происходит сразу, без вариантов. Если что-то внутри неё занимает неизвестное время - она не будет этого ждать. (потому что js изначально однопоточный, и еслиб функция ждала что-то синхронно - страница бы полностью зависала на всё время ожидания)

Можно передавать после req, res третьим параметром callback-функцию, которую вызывать внутри callback-функци переданной findOne и передавать ей результат.
function getUser (req, res, callback) {
// ...
users.findOne(cookies, (err, result) => {
  if (err) { console.log("err: " ,err) }
  else if(result) {
    console.log("result: ", result)
    callback(result);
  }
  else {console.log("result is not defined: ", result)}
})
Если не знаешь что такое callback - гугли, это основы.

Можно переделать функцию в асинхронную:
async function getUser (req, res) {
//...
const result = await new Promise(resolve => users.findOne(cookies, (err, result) => {
  if (err) { console.log("err: " ,err) }
  resolve(result);
}))

Только и вызывать такую функцию можно будет только в другой асинхронной функции через await:
const result = await getUser(req, res) или как Promise.
Если не знаешь что такое Promise или async\await - гугли, это основы.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы