Node.js の非同期プログラミングについて詳しく学び、4 つのソリューションを共有します

青灯夜游
リリース: 2021-09-14 10:15:03
転載
2578 人が閲覧しました

非同期 I/O がある場合は、非同期プログラミングが必要です。今日は Node.js で非同期プログラミングを学びましょう!

Node.js の非同期プログラミングについて詳しく学び、4 つのソリューションを共有します

非同期プログラミングの概要

以前のシングルスレッド モデルは、I/O が遅いため、同期 I/O の影響を受けていました。 /O が呼び出すと、CPU と I/O がアプリケーション レベルでオーバーラップできなくなります。プログラマの読書習慣や思考習慣に配慮するために、同期 I/O は長年にわたって普及してきました。 [推奨学習: 「nodejs チュートリアル 」]

Node.js の非同期プログラミングについて詳しく学び、4 つのソリューションを共有します

しかし、パフォーマンスに大きな問題があります。

Node は JavaScript とその内部非同期ライブラリを使用して、非同期をビジネス レベルに直接アップグレードします。 Node がもたらす最大の機能は、イベント駆動型のノンブロッキング I/O モデルです。ノンブロッキング I/O により、CPU と I/O が相互に待機することがなくなり、リソースをより有効に利用できるようになります。

Node.js の非同期プログラミングについて詳しく学び、4 つのソリューションを共有します

#非同期プログラミング ソリューション

目的: package.json のメイン フィールドに対応するファイルの内容を読み取ります

コールバック

非同期 I/O 操作にコールバック関数を使用する

const fs = require("fs");

fs.readFile("./package.json", { encoding: "utf-8" }, (err, data) => {
  if (err) throw err;
  const { main } = JSON.parse(data);
  fs.readFile(main, { encoding: "utf-8" }, (err, data) => {
    if (err) throw err;
    console.log(data);
  });
});
ログイン後にコピー

Node.js の非同期プログラミングについて詳しく学び、4 つのソリューションを共有します

問題: 解決方法コールバック地獄?

Promise

Promise は 4 つの状態を持つ有限状態マシンで、そのうちの 3 つは保留中と完了です。( Completed)、Rejected (拒否)、および未開始の状態もあります

詳細については、以前のブログ投稿を参照してください

Promise の初期探索

Node.js の非同期プログラミングについて詳しく学び、4 つのソリューションを共有します ##Promise を使用して、package.json のメイン フィールドに対応するファイル コンテンツを読み取ります。

const { readFile } = require("fs/promises");

readFile("./package.json", { encoding: "utf-8" })
  .then((res) => {
    return JSON.parse(res);
  })
  .then((data) => {
    return readFile(data.main, { encoding: "utf-8" });
  })
  .then((res) => {
    console.log(res);
  });
ログイン後にコピー

コールバックを使用した前のソリューションと比較すると、一連のネストされたコールバックがないことがわかります。非同期操作を処理するためのチェーン呼び出しの数。

Node.js の非同期プログラミングについて詳しく学び、4 つのソリューションを共有します

コールバックから Promise コールバックを Promise フォームに変換するにはどうすればよいですか?

Node 独自のツール関数 util.promisify を使用できます。

自分で実装できます:

function promisify(fn, receiver) {
  return (...args) => {
    return new Promise((resolve, reject) => {
      fn.apply(receiver, [
        ...args,
        (err, res) => {
          return err ? reject(err) : resolve(res);
        },
      ]);
    });
  };
}

const readFilePromise = promisify(fs.readFile, fs);
ログイン後にコピー

awaitawait 関数は try catch を使用して例外をキャッチします (並列処理に注意)

const { readFile } = require("fs/promises");

const start = async () => {
  const { main } = JSON.parse(
    await readFile("./package.json", { encoding: "utf-8" })
  );
  const data = await readFile(main, { encoding: "utf-8" });
  console.log(data);
};
start();
ログイン後にコピー

await の構文は同期プログラミングのように記述されます。ここでの操作は

serial

操作です。これは 1 行になります。 1 行は実行を待機しています。

Node.js の非同期プログラミングについて詳しく学び、4 つのソリューションを共有します複数のタスクを

並列処理できる場合は、このように記述するのは適切ではありません。これは、Promise.all を使用して並列タスクを操作できるということです。

ここで小さな質問もあります。授業後に先生に尋ねました。これが先生の答えです。

[Q] 非同期処理について、直列化と並列化の話になりますが、並列処理について質問です。並列シナリオで、他のタスクが成功するか失敗するかに関係なく各非同期タスクを実行し、最終的にエラーを均一に処理する必要がある場合、Promise.all を使用して複数の非同期タスクを処理すると、最初のタスク実行エラーが発生します。すべてのタスクを完了し、エラーを均一に処理するにはどうすればよいですか?Node.js の非同期プログラミングについて詳しく学び、4 つのソリューションを共有します

[回答] Promise.all は複数のリクエストを処理します。すべてのリクエストが成功すると、solve は実行結果を含む配列を返します。リクエストが失敗した場合、エラーは即座に拒否されるため、Promise.all を使用してこれを実装することはできません。 Promise には allSettled メソッド、

developer.mozilla.org/en-US/docs/…

#Event

Publish があります。およびサブスクライブ モード、Node.js 組み込みイベント モジュール

#HTTP など

server on('request')

イベント監視

const EventEmitter = require("events");

class MyEmitter extends EventEmitter {}

const myEmitter = new MyEmitter();

myEmitter.on("event", () => {
  console.log("an event occurred!");
});
myEmitter.emit("event");

const http = require("http");

const server = http.createServer((req, res) => {
  res.end("hello!!! this is YK!!!");
});
server.on("request", (req, res) => {
  console.log(req.url);
});

server.listen(3000);
ログイン後にコピー

Node.js の非同期プログラミングについて詳しく学び、4 つのソリューションを共有します

Node.js の非同期プログラミングについて詳しく学び、4 つのソリューションを共有します元アドレス: https://juejin.cn/post/7005509871000895524

著者: YK菌

プログラミング関連の知識について詳しくは、プログラミング ビデオをご覧ください。 !

以上がNode.js の非同期プログラミングについて詳しく学び、4 つのソリューションを共有しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:掘金--YK菌
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート