ホームページ  >  記事  >  ウェブフロントエンド  >  Node.js 非同期プログラミングにおけるコールバックの詳細な分析

Node.js 非同期プログラミングにおけるコールバックの詳細な分析

青灯夜游
青灯夜游転載
2021-07-06 11:30:182656ブラウズ

ノンブロッキング I/O の実行結果を受け取るには、コールバック関数が必要です。次の記事では、非同期プログラミングにおける Node.jscallback (コールバック) について詳しく説明します。

Node.js 非同期プログラミングにおけるコールバックの詳細な分析

[推奨学習: 「nodejs チュートリアル 」]

ノンブロッキング I/O の実行結果にはコールバック関数が必要ですはい、コールバック関数を使用するこの方法は非同期プログラミングです。

#非同期プログラミングのケース 1
function interview(callback) {
  setTimeout(() => {
    callback("success");
  }, 1000);
}

interview(function (res) {
  if (res === "success") {
    console.log("============我笑了");
  }
});

コールバック関数の形式の仕様

##error-first callbak
  • Node-style コールバック
  • 最初のパラメータはエラーで、次のパラメータは結果です
最初のパラメータがエラーになる理由

function interview(callback) {
  setTimeout(() => {
    if (Math.random() < 0.3) {
      callback("success");
    }
    throw new Error("fail");
  }, 1000);
}

try {
  interview(function (res) {
    if (res === "success") {
      console.log("============我笑了");
    }
  });
} catch (error) {
  console.log("fail", error);
}

Node.js 非同期プログラミングにおけるコールバックの詳細な分析上記のコードでは、

try catch

は、 throw new Error('fail')! によってスローされたエラーをキャプチャできません。 、しかし JS グローバルに投げられます! Node.js では、グローバル エラーは非常に深刻であり、プログラムのクラッシュを引き起こす可能性があります。 setTimeout の

throw

をキャプチャできない try catch がないのはなぜですか?これは、コール スタック および イベント ループ!

各イベント ループはまったく新しいコール スタックです!

setTimeoutとインタビューの 2 つの異なるイベント ループです。

ただし、コールバック関数のパラメータでエラーをスローすることで、この問題を解決できます。

function interview(callback) {
  setTimeout(() => {
    if (Math.random() < 0.3) {
      callback(null, "success");
    } else {
      callback(new Error("fail"));
    }
  }, 1000);
}

interview(function (error) {
  if (error) {
    return console.log("============我哭了");
  }
  console.log("============我笑了");
});
上記のコードでは、次のようにして問題を解決できます。パラメータの型を調べて、エラーがあるかどうかを判断します。しかし、Node.js にはコールバック関数が多数あり、すべての関数でパラメータの型が間違っているかどうかを判断することは不可能です。

Node.js では、最初のパラメーターは erro であり、2 番目のパラメーターは結果であると規定されています。最初のパラメータが空でない場合、非同期呼び出しでエラーが発生します。

非同期プロセス制御の問題

コールバック地獄

複数の非同期タスクが連続して発生する状況は以下のとおりです。 N 回のインタビューをシミュレートしましょう。

function interview(callback) {
  setTimeout(() => {
    if (Math.random() < 0.6) {
      callback(null, "success");
    } else {
      callback(new Error("fail"));
    }
  }, 1000);
}

interview(function (error) {
  if (error) {
    return console.log("======第一轮面试======我哭了");
  }

  interview(function (error) {
    if (error) {
      return console.log("====第二轮面试========我哭了");
    }

    interview(function (error) {
      if (error) {
        return console.log("====第三轮面试========我哭了");
      }

      console.log("三轮面试都成功了!啊哈哈哈!");
    });
  });
});

上記の非同期プロセスには 3 つのレベルの入れ子があることがわかります。これは、コードが比較的単純な状況にすぎません。したがって、実際のアプリケーションでは、入れ子になった各関数が非常に複雑になる可能性があり、そのため開発と保守が困難になり、それを見た人がイライラすることになります。これは、いわゆる ** コールバック地獄 **

a

複数の非同期タスクの同時状況

function interviewCompay() {
  let count = 0;
  interview(function (error) {
    if (error) {
      return console.log("====第一家公司面试========我哭了");
    }
    count++;
  });
  interview(function (error) {
    if (error) {
      return console.log("====第二家公司面试========我哭了");
    }
    count++;
    if (count === 2) {
      return console.log("两家公司面试都成功了!我笑了");
    }
  });
}
interviewCompay();

複数の非同期タスクの結果を取得するには、同じ変数を各非同期タスクに追加する必要があります

#非同期プロセスの制御問題を解決する

promise

    async await
  • プログラミング関連の知識の詳細については、次のサイトを参照してください。
  • プログラミングビデオ
! !

以上がNode.js 非同期プログラミングにおけるコールバックの詳細な分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はjuejin.cnで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。