为了账号安全,请及时绑定邮箱和手机立即绑定

如何避免在Node.js中长时间嵌套异步函数

如何避免在Node.js中长时间嵌套异步函数

杨魅力 2019-08-26 09:39:58
如何避免在Node.js中长时间嵌套异步函数我想创建一个显示来自数据库的一些数据的页面,所以我创建了一些从我的数据库中获取数据的函数。我只是Node.js中的新手,所以据我所知,如果我想在一个页面中使用所有这些(HTTP响应),我必须将它们全部嵌套:http.createServer(function (req, res) {   res.writeHead(200, {'Content-Type': 'text/html'});   var html = "<h1>Demo page</h1>";   getSomeDate(client, function(someData) {     html += "<p>"+ someData +"</p>";     getSomeOtherDate(client, function(someOtherData) {       html += "<p>"+ someOtherData +"</p>";       getMoreData(client, function(moreData) {         html += "<p>"+ moreData +"</p>";         res.write(html);         res.end();       });     });   });如果有很多这样的函数,那么嵌套就成了问题。有办法避免这种情况吗?我想这与你如何组合多个异步函数有关,这似乎是一个基本的东西。
查看完整描述

3 回答

?
绝地无双

TA贡献1946条经验 获得超4个赞

有趣的观察。请注意,在JavaScript中,您通常可以使用命名函数变量替换内联匿名回调函数。

下列:

http.createServer(function (req, res) {
   // inline callback function ...

   getSomeData(client, function (someData) {
      // another inline callback function ...

      getMoreData(client, function(moreData) {
         // one more inline callback function ...
      });
   });

   // etc ...});

可以重写看起来像这样:

var moreDataParser = function (moreData) {
   // date parsing logic};var someDataParser = function (someData) {
   // some data parsing logic

   getMoreData(client, moreDataParser);};var createServerCallback = function (req, res) {
   // create server logic

   getSomeData(client, someDataParser);

   // etc ...};http.createServer(createServerCallback);

但是,除非您计划在其他位置重用回调逻辑,否则通常更容易读取内联匿名函数,如您的示例所示。它还可以让您不必为所有回调找到一个名称。

另外请注意,正如@pst在下面的注释中所指出的,如果您正在访问内部函数中的闭包变量,则上述内容不是简单的翻译。在这种情况下,使用内联匿名函数更为可取。


查看完整回答
反对 回复 2019-08-26
  • 3 回答
  • 0 关注
  • 698 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信