Не возвращать что-либо из Promise и работать в NodeJS - PullRequest
0 голосов
/ 18 января 2019

В стремлении написать хороший чистый код, я создал функцию, в которой я настраиваю такие вещи, как res.status() или отправку res.send()

Теперь, в общем, я знаю, если мы ничего не возвращаем в Javascript, он возвращает undefined.

И, возможно, если мы создадим обещание и не разрешим его, это приведет к утечке памяти ?

Но это то же самое для .then() т.е. если мы ничего не возвращаем в нашем .then и аналогично, если мы вызываем функцию, которая устанавливает такие вещи, как res.status() и отправляет res.send()

Чтобы привести пример, это то, что я делаю

Рассмотрим этот маршрут Api и Middleware

router.use(MiddlewareAuth.eventBriteAuthentication)

router.get("/user", (req, res) => {
    eventBriteHelper.getEventbriteRequestedDataForAuthorizedUser("https://www.eventbriteapi.com/v3/users/me", req.session.contextToken["EventbriteAccessToken"])
    .then(response => {
        res.send(response.data)
    })
    .catch(error => {
        errorCodesHelper.errorStatusCodeAndResponseMeetupLoggedInUser(req, res, error)
    })
})

Здесь,

errorCodesHelper.errorStatusCodeAndResponseMeetupLoggedInUser(req, res, error)

это функция

const errorStatusCodeAndResponseEventbriteLoggedInUser = (req, res, error) => {

    //Updaing the same in firebase
    if (req.user["eventbrite"] !== "warning") {
        FirebaseHelper.updateDataInDb("users", req.user.email, {"eventbrite": "warning"})
        .catch(error => {
            throw error
        })
    req.user["eventbrite"] = "warning"
    }

    res.status(error.response.status)
    res.send(error.response.data.problem)
}

Это нормально?

И, наконец, в моем токене обновления встречи .then() я ничего не возвращаю.

  const meetupRefreshToken = (req, res) => {
   return helperFunctionsAxios.refreshingAccessToken("meetup", req, res)
        .then(response => {
            let expiryTime = authHelper.calculatingTokenExpiryTime(response.data.expires_in)   
            let TokenToStore = {"meetupRefreshToken": response.data.refresh_token, "meetupAccessToken": response.data.access_token, "meetup_expires_in": expiryTime }
            FirebaseHelper.updateDataInDb("authentication", req.user.email, TokenToStore)
            .catch(err => {throw err})   
            req.session.contextToken = {...req.session.contextToken, ...TokenToStore}
        })
        .catch(error => {
            errorCodesHelper.errorStatusCodeAndResponseMeetupLoggedInUser(req, res, error)
        }) 
    }

Это тоже хорошо? Если да, то может ли кто-нибудь указать на ситуацию, когда не возвращение чего-либо может вызвать утечку памяти?

1 Ответ

0 голосов
/ 18 января 2019

И, возможно, если мы создадим обещание и не разрешим его, это приведет к утечке памяти?

Только если кто-то навсегда вернется к возвращенному обещанию, ожидая его разрешения.

Но это то же самое для .then (), то есть если мы ничего не возвращаем в нашем .then и аналогично, если мы вызываем функцию, которая устанавливает такие вещи, как res.status () и отправляет res.send()

Ничего не возвращать из обработчика .then() - это прекрасно, если пользователь обещания не ожидает разрешенного значения.Это просто оставляет разрешенное значение обещания как undefined.

Рассмотрим этот маршрут Api и Middleware

Это прекрасно.Вы используете .then() и .catch(), чтобы узнать, когда выполняется асинхронная операция, и затем вы отправляете ответ в любом случае.Ничто не использует окончательное обещание, поэтому не имеет значения, каково его разрешенное значение.

Это [errorStatusCodeAndResponseEventbriteLoggedInUser function] нормально?

Это немного странно и имеетнекоторые проблемы.Это будет генерировать предупреждения о необдуманных отклонениях в некоторых реализациях.Похоже, вы звоните по номеру FirebaseHelper.updateDataInDb(), когда вы ничего не делаете с результатом, независимо от того, успешен он или нет.Мне не ясно, почему или каково ваше намерение для этого.Если это просто какая-то запись в журнале, то, возможно, я мог бы понять (я бы все равно поставил на нее .then(), а не throw с .catch(), когда ничего не слушается).Но, если это не предполагается реализацией «забыл и забыл», то вы продолжаете, не дожидаясь завершения операции.

И, наконец, в моем маркере обновления встречи .then(),Я ничего не возвращаю.

Как я уже говорил выше, единственная проблема, когда не возвращается что-либо из обработчика .then(), это проблема, когда кто-то использует возвращенное обещание и ожидает разрешенного значения.Если вызывающая сторона не ожидает разрешенного значения, возвращать его не нужно.Разрешенное значение будет просто undefined, что прекрасно в Javascript.

Эта конструкция:

 .catch(err => {throw err}) 

не имеет смысла.Ваш код работает так же без этого.Либо сделайте что-нибудь полезное в обработчике .catch(), либо пропустите его и дайте ему возможность обратиться к вызывающей стороне.

Кроме того, в вашей последней функции вы снова не дожидаетесь завершения FirebaseHelper.updateDataInDb(), так что это по сути новыйнесвязанная цепочка обещаний, действующая в режиме «забей и забудь».Это может создать предупреждения для необоснованных отклонений.Как правило, это не очень хорошая практика, так как молча терпит неудачу, и никто никогда не узнает об этом и ничего не ждет.

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