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

如何避免在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();
      });
    });
  });

如果有很多这样的函数,那么嵌套就成了问题

有办法避免这种情况吗?我想这与你如何组合多个异步函数有关,这似乎是一个基本的东西。


杨魅力
浏览 699回答 3
3回答

绝地无双

有趣的观察。请注意,在JavaScript中,您通常可以使用命名函数变量替换内联匿名回调函数。下列:http.createServer(function&nbsp;(req,&nbsp;res)&nbsp;{ &nbsp;&nbsp;&nbsp;//&nbsp;inline&nbsp;callback&nbsp;function&nbsp;... &nbsp;&nbsp;&nbsp;getSomeData(client,&nbsp;function&nbsp;(someData)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;another&nbsp;inline&nbsp;callback&nbsp;function&nbsp;... &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getMoreData(client,&nbsp;function(moreData)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;one&nbsp;more&nbsp;inline&nbsp;callback&nbsp;function&nbsp;... &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}); &nbsp;&nbsp;&nbsp;}); &nbsp;&nbsp;&nbsp;//&nbsp;etc&nbsp;...});可以重写看起来像这样:var&nbsp;moreDataParser&nbsp;=&nbsp;function&nbsp;(moreData)&nbsp;{ &nbsp;&nbsp;&nbsp;//&nbsp;date&nbsp;parsing&nbsp;logic};var&nbsp;someDataParser&nbsp;=&nbsp;function&nbsp;(someData)&nbsp;{ &nbsp;&nbsp;&nbsp;//&nbsp;some&nbsp;data&nbsp;parsing&nbsp;logic &nbsp;&nbsp;&nbsp;getMoreData(client,&nbsp;moreDataParser);};var&nbsp;createServerCallback&nbsp;=&nbsp;function&nbsp;(req,&nbsp;res)&nbsp;{ &nbsp;&nbsp;&nbsp;//&nbsp;create&nbsp;server&nbsp;logic &nbsp;&nbsp;&nbsp;getSomeData(client,&nbsp;someDataParser); &nbsp;&nbsp;&nbsp;//&nbsp;etc&nbsp;...};http.createServer(createServerCallback);但是,除非您计划在其他位置重用回调逻辑,否则通常更容易读取内联匿名函数,如您的示例所示。它还可以让您不必为所有回调找到一个名称。另外请注意,正如@pst在下面的注释中所指出的,如果您正在访问内部函数中的闭包变量,则上述内容不是简单的翻译。在这种情况下,使用内联匿名函数更为可取。
打开App,查看更多内容
随时随地看视频慕课网APP