非同期 I/O がある場合は、非同期プログラミングが必要です。今日は Node.js で非同期プログラミングを学びましょう!
以前のシングルスレッド モデルは、I/O が遅いため、同期 I/O の影響を受けていました。 /O が呼び出すと、CPU と I/O がアプリケーション レベルでオーバーラップできなくなります。プログラマの読書習慣や思考習慣に配慮するために、同期 I/O は長年にわたって普及してきました。 [推奨学習: 「nodejs チュートリアル 」]
しかし、パフォーマンスに大きな問題があります。
Node は JavaScript とその内部非同期ライブラリを使用して、非同期をビジネス レベルに直接アップグレードします。 Node がもたらす最大の機能は、イベント駆動型のノンブロッキング I/O モデルです。ノンブロッキング I/O により、CPU と I/O が相互に待機することがなくなり、リソースをより有効に利用できるようになります。
コールバック
非同期 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); }); });
Promise
Promise は 4 つの状態を持つ有限状態マシンで、そのうちの 3 つは保留中と完了です。( Completed)、Rejected (拒否)、および未開始の状態もあります詳細については、以前のブログ投稿を参照してください##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); });
コールバックを使用した前のソリューションと比較すると、一連のネストされたコールバックがないことがわかります。非同期操作を処理するためのチェーン呼び出しの数。
コールバックから 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 行は実行を待機しています。
複数のタスクを
並列処理できる場合は、このように記述するのは適切ではありません。これは、Promise.all を使用して並列タスクを操作できるということです。ここで小さな質問もあります。授業後に先生に尋ねました。これが先生の答えです。
[Q] 非同期処理について、直列化と並列化の話になりますが、並列処理について質問です。並列シナリオで、他のタスクが成功するか失敗するかに関係なく各非同期タスクを実行し、最終的にエラーを均一に処理する必要がある場合、Promise.all を使用して複数の非同期タスクを処理すると、最初のタスク実行エラーが発生します。すべてのタスクを完了し、エラーを均一に処理するにはどうすればよいですか?
[回答] Promise.all は複数のリクエストを処理します。すべてのリクエストが成功すると、solve は実行結果を含む配列を返します。リクエストが失敗した場合、エラーは即座に拒否されるため、Promise.all を使用してこれを実装することはできません。 Promise には allSettled メソッド、developer.mozilla.org/en-US/docs/…
#EventPublish があります。およびサブスクライブ モード、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);
元アドレス: https://juejin.cn/post/7005509871000895524
著者: YK菌
プログラミング関連の知識について詳しくは、プログラミング ビデオをご覧ください。 !
以上がNode.js の非同期プログラミングについて詳しく学び、4 つのソリューションを共有しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。