我正在使用mysql开发一个快速应用程序。我的节点版本是6.11.2。
我的路由器文件是
const router = require("express").Router();
const project = require("../../modules/project/");
// individual project routes
router.get("/", project.getAllProject);
现在我的getAllProject函数代码如下。
/* Get all project */
getAllProject(req, res, next) {
buildQuery(req) /* Build query based on logged in user */
.then(query => runDbQuery(req, query)) /* execute query */
.then(results => formatResult(results)) /* Build response for front end */
.then(output => res.send(output)) /* return results */
.catch(err =>
next(err, req, res, next)
); /* catch error and pass it error middle ware */
}
buildQuery,runDbQuery,fromatResult返回承诺。
在我的代码审核客户端上评论如下
在这里你的方法称为“getAllProjects” 在数据交付之前需要进行3次回调检查,总共需要4次回调。这太多了。这很慢,因为这些 在将数据发送到占用服务器处理能力的客户端之前,需要完成回调
他还让我在一次回调中做所有事情并将数据返回给客户。承诺和回调方法会降低性能。他还建议在快递中使用RXJS Observable。
答案 0 :(得分:-1)
理论上,每个函数调用都会花费一些资源(比如上下文/闭包构造)。所以,是的,根据定义,有三个.then()
较慢而不是单个.then()
,即使在这两个案例中同时完成了相同的工作。
在没有运行基准测试的情况下,与单个案例相比,多少多少真的很难...因此,我创建了一个simple one你可以尝试自己。
在我的老式和非常懒散的笔记本电脑上,基准测试结果看起来像这样:
希望,这可以回答你的问题。
现在,性能不是代码评估的唯一标准。另一个是可读性。在某些情况下,如果您有多个.then()
调用,则代码将看起来更具可读性,其中每个调用都声明了特定的数据转换步骤。只是旁注。 我个人更喜欢可读性而不是性能,因为对我来说,它选择更高的正确性而不是性能。您的客户可能会有不同的想法。
就Observable
而言,您可能想也可能不想使用它们。这取决于您的应用程序的性质。 Observable
涉及事件流和操纵。然而,Promises
与ES6的await/async
功能一致。所以,这里没有明确的答案,除非我们更多地了解背景。