为了编写精美的代码,我创建了函数,用于设置 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()
也可以吗?如果是,那么有人可以指出不返回任何内容会导致内存泄漏的情况吗?
答案 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()
完成,因此,这实际上是一条新的,未链接的承诺链,以即发即弃的方式进行。它可能会为未捕获的拒绝创建警告。通常,这不是一个好习惯,因为它会静默失败,并且没人会知道,没有人等待。