当前位置: 首页 > 面试题库 >

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

祁辰阳
2023-03-14
问题内容

我想制作一个页面来显示数据库中的某些数据,因此我创建了一些函数来从数据库中获取该数据。我只是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();
      });
    });
  });

如果有很多类似的功能,那么 嵌套就会成为问题

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


问题答案:

有趣的观察。请注意,在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在下面的注释中指出的那样,如果您要在内部函数中访问闭包变量,则以上内容将不是简单的转换。在这种情况下,使用内联匿名函数更为可取。



 类似资料:
  • 问题内容: 我想制作一个页面来显示数据库中的一些数据,因此我创建了一些函数来从数据库中获取数据。我只是Node.js的新手,据我了解,如果我想在一个页面中使用所有这些内容(HTTP响应),则必须将它们全部嵌套: 如果有很多类似的功能,那么 嵌套就会成为问题 。 有办法避免这种情况吗?我想这与如何组合多个异步函数有关,这似乎是基本的东西。 问题答案: 有趣的观察。请注意,在JavaScript中,您

  • 问题内容: 我有一个客户端库,在该客户端库中对我的REST服务进行http远程调用,然后返回给客户,该客户正在调用我的库,其中包含从REST服务获得的响应以及所有错误(如果包装了任何错误)围绕对象。 这是我的枚举类: 这是我的枚举类: 如您所见,在我的课堂上我有很多领域,因此我有一个很长的构造器,每次当我做一个对象的时候都会有很大的联系。将来我可能会有更多的字段,但目前只有这些字段。 有什么更好的

  • Lodash castArray函数没有任何特殊之处。有没有什么方法可以在没有任何外部库的情况下,利用最新的语言功能解决这个问题,但时间很短? 如果您不熟悉该任务: 有没有办法在没有类型检查的情况下做到这一点?请注意,我寻找最短的等效物ES6。

  • 问题内容: 我试图研究应如何精确地编写异步函数。经过大量的文档研究之后,我仍然不清楚。 如何为Node编写异步函数? 如何正确实施错误事件处理? 问我问题的另一种方式是:我应该如何解释以下功能? 问题答案: 您似乎将异步IO与异步功能混淆了。由于非阻塞IO更好,所以node.js使用异步非阻塞IO。理解它的最好方法是去观看ryan dahl的一些视频。 如何为Node编写异步函数? 只需编写普通函

  • 问题内容: 我正在编写一个函数,该函数最多可以调用5000次。当然,我得到了。有什么办法可以以一种非常简单的方式重写此代码?: 顺便说一下,我们可以调用这些函数的深度有什么限制? 问题答案: 使用显式的对象堆栈和循环,而不是调用堆栈和递归:

  • 问题内容: 在我的节点应用程序中,我正在使用mocha测试我的代码。使用mocha调用许多异步函数时,出现超时错误()。我该如何解决? 问题答案: 您可以在运行测试时设置超时: 或者,您可以通过编程为每个套件或每个测试设置超时: 有关更多信息,请参阅文档。