Rumah  >  Artikel  >  hujung hadapan web  >  Ketahui lebih lanjut tentang pengaturcaraan tak segerak dalam Node.js dan kongsi empat penyelesaian

Ketahui lebih lanjut tentang pengaturcaraan tak segerak dalam Node.js dan kongsi empat penyelesaian

青灯夜游
青灯夜游ke hadapan
2021-09-10 10:26:442578semak imbas

Jika ada I/O tak segerak, mesti ada pengaturcaraan tak segerak! Mari belajar pengaturcaraan tak segerak dalam Node.js hari ini!

Ketahui lebih lanjut tentang pengaturcaraan tak segerak dalam Node.js dan kongsi empat penyelesaian

Ikhtisar Pengaturcaraan Asynchronous

Bekas model single-threaded berada di bawah pengaruh I/O segerak kerana I perlahan /O memanggil , menyebabkan CPU dan I/O tidak dapat bertindih pada tahap aplikasi. Untuk menjaga tabiat membaca dan berfikir pengaturcara, I/O segerak telah popular selama bertahun-tahun. [Pembelajaran yang disyorkan: "tutorial nodejs"]

Ketahui lebih lanjut tentang pengaturcaraan tak segerak dalam Node.js dan kongsi empat penyelesaian

Tetapi terdapat masalah prestasi yang besar!

Node menggunakan JavaScript dan pustaka tak segerak dalamannya untuk terus meningkatkan tak segerak ke peringkat perniagaan. Ciri terbesar yang dibawa oleh Node ialah model I/O tidak menyekat dipacu peristiwa. I/O tanpa sekatan boleh menghalang CPU dan I/O daripada menunggu antara satu sama lain, membolehkan sumber digunakan dengan lebih baik.

Ketahui lebih lanjut tentang pengaturcaraan tak segerak dalam Node.js dan kongsi empat penyelesaian

Penyelesaian pengaturcaraan tak segerak

Tujuan: Baca kandungan fail yang sepadan dengan medan utama dalam package.json

Panggil Balik

Menggunakan fungsi panggil balik untuk operasi I/O tak segerak

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);
  });
});

Ketahui lebih lanjut tentang pengaturcaraan tak segerak dalam Node.js dan kongsi empat penyelesaian

Soalan: Bagaimana untuk menyelesaikan neraka panggilan balik?

Janji

Promise ialah mesin keadaan terhingga dengan empat keadaan, tiga daripadanya Menunggu dan Ditepati. Selesai), Ditolak (ditolak), dan terdapat juga status yang belum dimulakan

Untuk butiran, anda boleh lihat catatan blog saya sebelum ini Penerokaan awal Janji

Ketahui lebih lanjut tentang pengaturcaraan tak segerak dalam Node.js dan kongsi empat penyelesaian

Gunakan Promise untuk membaca kandungan fail yang sepadan dengan medan utama dalam 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);
  });

Membandingkan penyelesaian sebelumnya menggunakan Panggilan Balik, dapat dilihat bahawa tiada panggilan balik bersarang. Melalui satu siri panggilan gaya rantai untuk mengendalikan operasi tak segerak.

Ketahui lebih lanjut tentang pengaturcaraan tak segerak dalam Node.js dan kongsi empat penyelesaian

Panggil Balik ke Janji

Bagaimana hendak menukar Panggilan Balik kepada borang Janji?

Anda boleh menggunakan fungsi alat Node sendiri util.promisify

untuk melaksanakannya sendiri:

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);

tunggu

fungsi tunggu menggunakan try catch untuk menangkap pengecualian (perhatikan pemprosesan selari)

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();

Sintaks tunggu ditulis seperti pengaturcaraan segerak Operasi di sini ialah bersiri Operasi akan menunggu pelaksanaan baris demi baris.

Ketahui lebih lanjut tentang pengaturcaraan tak segerak dalam Node.js dan kongsi empat penyelesaian

Sekiranya beberapa tugasan boleh disejajarkan, tidak baik menulis dengan cara ini. Ini adalah, kita boleh menggunakan Promise.all untuk mengendalikan tugasan selari

Ada juga soalan kecil di sini saya bertanya kepada guru selepas kelas, dan ini adalah jawapan guru

Ketahui lebih lanjut tentang pengaturcaraan tak segerak dalam Node.js dan kongsi empat penyelesaian

[Q] Berkenaan pemprosesan tak segerak, apabila ia berkaitan dengan siri dan selari, saya mempunyai soalan mengenai pemprosesan selari. Jika senario selari memerlukan setiap tugas tak segerak mesti dilaksanakan tanpa mengira kejayaan atau kegagalan tugas lain, dan akhirnya mengendalikan ralat secara seragam, maka apabila menggunakan Promise.all untuk memproses berbilang tugas tak segerak, ralat pelaksanaan tugas pertama akan ditemui dipulangkan. Bagaimanakah kami boleh menyelesaikan semua tugas dan menangani ralat secara seragam? Jika permintaan gagal, ralat akan ditolak serta-merta, jadi kami tidak boleh menggunakan Promise.all untuk melaksanakan perkara ini. Promise mempunyai kaedah allSettled,

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

Acara Mod terbitkan dan langgan, modul acara terbina dalam Node.js

seperti HTTP

pemantauan acara

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);

Ketahui lebih lanjut tentang pengaturcaraan tak segerak dalam Node.js dan kongsi empat penyelesaian

Ketahui lebih lanjut tentang pengaturcaraan tak segerak dalam Node.js dan kongsi empat penyelesaian

Alamat asal: https://juejin.cn/post/7005509871000895524

Pengarang: YK bacteria

Untuk lebih banyak pengetahuan berkaitan pengaturcaraan, sila lawati: Video Pengaturcaraan! !

Atas ialah kandungan terperinci Ketahui lebih lanjut tentang pengaturcaraan tak segerak dalam Node.js dan kongsi empat penyelesaian. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:掘金--YK菌. Jika ada pelanggaran, sila hubungi admin@php.cn Padam