0

Node.js に非同期クエリがあります。変数sq3は接続変数です。たとえば、次のようなものです。

for (var i in res) {
  if (i == 1) {
    sq3.query("SELECT * from students;",

      function (err, res) {
        if (err) {
          throw err;
        } else {
          if (res.length == 1) {
            //do something
          } else {
            //break for
          }
        }
      });

    sq3.end();
  }
}

コールバック関数から抜け出すにはどうすればよいですか? ありがとう

4

3 に答える 3

5

ループの代わりに再帰を使用して、このようにしてください。これにより、必要なロジックを実現できるだけではありません。また、一度に大量の非同期リクエストをスピンアップすることもありません。それらは順番に実行されますが、非同期であるため、依然としてパフォーマンスが高くなります。

function lookatEntireResponse(res) {

    function lookAtItemInResponse(item) {
        if(item == 1) {
            sq3.query("SELECT * from students;",

                function(err, res) {
                    if (err)
                    {
                       throw err;
                    }

                    else
                    {
                        if(res.length==1)
                        {
                            doSomething(item);
                            lookAtItemInResponse(res.shift());
                        }
                        else
                        {
                           //just don't call the next lookAtItemInResponse function, effectively same thing as "break;"
                        }

                    }
                });

            sq3.end();
        } else {
            lookAtItemInResponse(res.shift());
        }
    }

    lookAtItemInResponse(res.shift());

}

同様のロジックで同時リクエストをスロットリングすることを検討できます (たとえば、lookAtItem 呼び出しごとに 10 のそのようなリクエストを許可します。このようにして、2 つのメソッドのハイブリッドを実現し、パフォーマンスのために同時リクエストの数を最適化することができます。Async ライブラリはこのようなものを作成します。より簡単に。

于 2013-08-21T14:00:52.283 に答える
0
for (var i = 0; i < res.length; i++) {
  if (i == 1) {
    sq3.query("SELECT * from students;",

      function (err, res) {
        if (err) {
          throw err;
        } else {
          if (res.length == 1) {
            //do something
          } else {
            i = res.length
          }
        }
      });

    sq3.end();
  }
}
于 2021-04-19T10:11:38.000 に答える