不从Promise和NodeJS中的函数返回任何内容

时间:2019-01-18 07:08:50

标签: javascript node.js promise

为了编写精美的代码,我创建了函数,用于设置 res.status() 或发送 res.send()

现在,总的来说,我知道,如果我们不使用JavaScript返回任何内容,它将返回未定义的内容。

如果我们创建一个诺言而不履行它,可能会导致内存泄漏吗?

但是对于 .then() 来说是相同的,即,如果我们未在自己的.then中返回任何内容,则类似地,如果我们调用函数来设置类似 {{1} 并发送 res.status()

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

考虑此Api路线和中间件

res.send()

在这里

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

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

1 个答案:

答案 0 :(得分:2)

  

也许我们创建一个诺言而不履行它,会导致内存泄漏吗?

仅当某人无限期地挂在返回的承诺上,希望其解决。

  

.then()也是一样,即如果我们不返回.then中的任何内容,并且类似地,如果我们调用函数来设置诸如res.status()并发送res.send()的函数,则同样如此

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

  

考虑此Api路线和中间件

那很好。您正在使用.then().catch()来了解异步操作何时完成,然后无论哪种情况都将发送响应。什么都没有使用最终承诺,所以它的解决价值是什么都没关系。

  

[errorStatusCodeAndResponseEventbriteLoggedInUser函数]可以吗?

有点奇怪,并且有一些问题。在某些实现中,它将生成有关未捕获的拒绝的警告。似乎您对FirebaseHelper.updateDataInDb()的调用正在执行“一劳永逸”操作,无论是否成功,您都不会对结果进行任何操作。对我来说还不清楚为什么或您打算这样做。如果只是某种日志记录,那么也许我可以理解(当没有人在听的时候,我仍然会在上面写上.then(),而不是throw上的.catch())。但是,如果不应将这种做法付诸东流,那么您无需等待操作完成就可以继续进行操作。

  

最后,在我的聚会刷新令牌.then()中,我什么也没返回。

如上所述,唯一没有从.then()处理程序返回任何内容的问题是,有人正在使用返回的Promise并期望得到解析的值。如果呼叫者不希望得到一个可解析的值,则无需返回一个。解析后的值将仅为undefined,这在Javascript中非常合适。

此构造:

 .catch(err => {throw err}) 

毫无意义。否则,您的代码将完全相同。在.catch()处理程序中做一些有用的事情,或者忽略它,让它渗透到调用者中。

此外,在您的最后一个函数中,您不再等待FirebaseHelper.updateDataInDb()完成,因此,这实际上是一条新的,未链接的承诺链,以即发即弃的方式进行。它可能会为未捕获的拒绝创建警告。通常,这不是一个好习惯,因为它会静默失败,并且没人会知道,没有人等待。