Node.js で非同期関数の長いネストを回避する方法 質問する

Node.js で非同期関数の長いネストを回避する方法 質問する

DB からデータを表示するページを作りたいので、DB からデータを取得する関数をいくつか作成しました。私は Node.js の初心者なので、私の理解では、これらすべてを 1 つのページ (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();
      });
    });
  });

そのような機能がたくさんあると、巣作りが問題になる

これを回避する方法はありますか? 複数の非同期関数を組み合わせる方法に関係していると思いますが、これは基本的なことのようです。

ベストアンサー1

興味深い観察です。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以下のコメントで述べたように、内部関数内でクロージャ変数にアクセスする場合、上記は単純な変換にはなりません。そのような場合は、インライン匿名関数を使用する方がさらに望ましいです。

おすすめ記事