首页 > 解决方案 > 没有从 NodeJS 中的 Promise 和函数返回一些东西

问题描述

为了编写一个漂亮干净的代码,我创建了一个函数,我正在设置诸如res.status()或发送之类的东西res.send()

现在,总的来说,我知道,如果我们在 Javascript 中不返回任何内容,它会返回未定义。

并且可能如果我们创建一个promise并且不解决它,它会导致内存泄漏

但是,.then()如果我们在 .then 中不返回任何内容,类似地,如果我们调用设置类似res.status()和发送的函数的函数,这是否相同res.send()

举个例子,这就是我正在做的

考虑这个 Api 路由和中间件

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)
        }) 
    }

这也行吗?如果是,那么有人可以指出不返回任何内容会导致内存泄漏的情况吗?

标签: javascriptnode.jspromise

解决方案


并且可能如果我们创建一个 Promise 并且不解决它,它会导致内存泄漏?

只有当有人无限期地期待它解决时,才会坚持返回的承诺。

但是对于 .then() 是否相同,即如果我们在 .then 中不返回任何内容,类似地,如果我们调用设置 res.status() 之类的函数并发送 res.send() 的函数

.then()只要 Promise 的用户不期望一个已解析的值,不从处理程序返回任何东西是完全可以的。它只是将承诺的已解决值保留为undefined.

考虑这个 Api 路由和中间件

那很好。您正在使用.then().catch()知道异步操作何时完成,然后在任何一种情况下都发送响应。没有任何东西使用最终的承诺,所以它的解析值是什么并不重要。

这 [errorStatusCodeAndResponseEventbriteLoggedInUser 函数] 好吗?

这有点奇怪并且有一些问题。它会在某些实现中生成有关未捕获拒绝的警告。看起来你正在做某种即发即弃的调用,FirebaseHelper.updateDataInDb()无论它成功与否,你都没有对结果做任何事情。我不清楚你为什么或你的意图是什么。如果它只是某种日志记录,那么也许我可以理解(我仍然会.then()在它上面加上一个,而不是throw.catch()没有人听的时候开始)。但是,如果这不应该是一个即发即弃的实现,那么您将继续进行而不等待操作完成。

最后,在我的聚会刷新令牌.then()中,我没有返回任何东西。

正如我上面所说,唯一不从.then()处理程序返回的东西是一个问题是当有人使用返回的承诺并期待一个已解决的值时。如果调用者不期望解析值,则无需返回一个。解析的值将undefined在 Javascript 中非常好。

这种结构:

 .catch(err => {throw err}) 

是没有意义的。没有它,您的代码也可以正常工作。要么在处理程序中做一些有用的事情,.catch()要么忽略它并让它渗透到调用者。

此外,在您的最后一个函数中,您不再等待FirebaseHelper.updateDataInDb()完成,因此这本质上是一个新的、未链接的承诺链,它以“即发即弃”模式进行。它可能会为未捕获的拒绝创建警告。这通常不是一个好的做法,因为它会默默地失败,没有人会知道,也没有什么等待它。


推荐阅读