>  기사  >  웹 프론트엔드  >  Node.js의 비동기 프로그래밍에 대해 자세히 알아보고 네 가지 솔루션을 공유하세요.

Node.js의 비동기 프로그래밍에 대해 자세히 알아보고 네 가지 솔루션을 공유하세요.

青灯夜游
青灯夜游앞으로
2021-09-10 10:26:442576검색

비동기 I/O가 있다면 비동기 프로그래밍도 있어야 합니다! 오늘은 Node.js로 비동기 프로그래밍을 배워봅시다!

Node.js의 비동기 프로그래밍에 대해 자세히 알아보고 네 가지 솔루션을 공유하세요.

비동기 프로그래밍 개요

동기식 I/O의 영향으로 이전 단일 스레드 모델은 느린 I/O 호출로 인해 애플리케이션 수준에서 CPU와 I/O를 겹치지 못했습니다. 프로그래머의 읽기 및 사고 습관을 관리하기 위해 동기식 I/O가 수년 동안 인기를 끌었습니다. [추천 학습: "nodejs tutorial"]

Node.js의 비동기 프로그래밍에 대해 자세히 알아보고 네 가지 솔루션을 공유하세요.

하지만 성능에 큰 문제가 있습니다!

Node는 JavaScript와 내부 비동기 라이브러리를 사용하여 비동기를 비즈니스 수준으로 직접 향상시킵니다. Node가 가져온 가장 큰 특징은 이벤트 중심의 Non-Blocking I/O 모델입니다. 비차단 I/O는 CPU와 I/O가 서로 대기하는 것을 방지하여 리소스 활용도를 향상시킵니다.

Node.js의 비동기 프로그래밍에 대해 자세히 알아보고 네 가지 솔루션을 공유하세요.

비동기 프로그래밍 솔루션

목적: package.json의 기본 필드에 해당하는 파일 내용을 읽습니다.

Callback

콜백 함수를 사용하여 비동기 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의 비동기 프로그래밍에 대해 자세히 알아보고 네 가지 솔루션을 공유하세요.

질문: 콜백 지옥을 해결하는 방법은 무엇입니까?

Promise

Promise는 4가지 상태를 갖는 유한 상태 머신입니다. 그 중 3가지 핵심 상태는 Pending(일시 중지), Fulfilled( Completed), Rejected(거부됨), 그리고 시작되지 않은 상태도 있습니다

자세한 내용은 이전 블로그 게시물을 참조하세요Promise의 초기 탐색

Node.js의 비동기 프로그래밍에 대해 자세히 알아보고 네 가지 솔루션을 공유하세요.

Promise를 사용하여 메인 필드에 해당하는 파일 내용을 읽습니다. in 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의 비동기 프로그래밍에 대해 자세히 알아보고 네 가지 솔루션을 공유하세요.

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

await

await 함수는 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의 구문 동기 프로그래밍과 마찬가지로 여기서의 작업은 한 줄씩 실행을 기다리는 직렬 작업입니다.

Node.js의 비동기 프로그래밍에 대해 자세히 알아보고 네 가지 솔루션을 공유하세요.

여러 작업이 병렬될 수 있다면 이렇게 쓰는 것은 좋지 않을 것입니다. 즉, Promise.all을 사용하여 병렬 작업을 수행할 수 있습니다

여기에도 작은 질문이 있습니다. 수업이 끝난 후 선생님께 물었는데 선생님의 답변입니다

Node.js의 비동기 프로그래밍에 대해 자세히 알아보고 네 가지 솔루션을 공유하세요.

[Q] 비동기 부분에서는, 직렬 및 병렬 처리와 관련하여 병렬 처리에 관해 질문이 있습니다. 병렬 시나리오에서 다른 작업의 성공 또는 실패에 관계없이 각 비동기 작업을 실행해야 하고 최종적으로 오류를 균일하게 처리해야 하는 경우 Promise.all을 사용하여 여러 비동기 작업을 처리할 때 첫 번째 작업 실행 오류가 발생합니다. 결과가 나오면 반환됩니다. 요청이 실패하면 오류가 즉시 거부되므로 Promise.all을 사용하여 이를 구현할 수 없습니다. Promise에는 allSettled 메소드(

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

Event게시 및 구독 모드, Node.js 내장 이벤트 모듈

예: HTTP

이벤트)가 있습니다. 모니터링

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);
server on('request')

Node.js의 비동기 프로그래밍에 대해 자세히 알아보고 네 가지 솔루션을 공유하세요.

Node.js의 비동기 프로그래밍에 대해 자세히 알아보고 네 가지 솔루션을 공유하세요.

원본주소 : https://juejin.cn/post/7005509871000895524

저자 : YK Bacteria

더 많은 프로그래밍 관련 지식을 보려면 프로그래밍 비디오를 방문하세요! !

위 내용은 Node.js의 비동기 프로그래밍에 대해 자세히 알아보고 네 가지 솔루션을 공유하세요.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 掘金--YK菌에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제