>  기사  >  웹 프론트엔드  >  Node.js 비동기 프로그래밍의 콜백에 대한 심층 분석

Node.js 비동기 프로그래밍의 콜백에 대한 심층 분석

青灯夜游
青灯夜游앞으로
2021-07-06 11:30:182674검색

Non-blocking I/O의 연산 결과를 수신하려면 콜백 함수가 필요합니다. 다음 글에서는 비동기 프로그래밍의 Node.js콜백(콜백)에 대해 자세히 소개합니다.

Node.js 비동기 프로그래밍의 콜백에 대한 심층 분석

【추천 학습: "nodejs tutorial"】

비차단 I/O의 실행 결과는 콜백 함수로 수신되어야 합니다. 이 콜백 함수 사용 방법은 비동기 프로그래밍입니다!

비동기 프로그래밍 사례 1

function interview(callback) {
  setTimeout(() => {
    callback("success");
  }, 1000);
}

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

콜백 함수 형식 사양

  • error-first callbak
  • 노드 스타일 콜백
  • 첫 번째 매개 변수는 error이고 다음 매개 변수는 결과

왜 첫 번째 매개변수는 error

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 catchthrow new Error('fail')로 발생한 오류를 캡처할 수 없습니다! , 그러나 JS 글로벌에 던져졌습니다! Node.js에서 전역 오류는 매우 심각한 문제이며 프로그램 충돌을 일으킬 수 있습니다! try catch并不能捕获 throw new Error('fail') 抛出的错误!,而是抛出到了 JS 全局! 在 Node.js 中,全局错误时非常严重的事情,会造成程序的崩溃!

为什么没 try catch 无法捕获 setTimeout 里面的 throw 呢? 这就跟调用栈事件循环有关系了!

每一个事件循环都是一个全新的调用栈! setTimeout왜 setTimeout에서 throwtry catch하여 캡처할 수 없나요? 이는

call stack

event loop과 관련이 있습니다!

모든 이벤트 루프는 완전히 새로운 호출 스택이며 인터뷰는 두 가지 다른 이벤트 루프입니다!

하지만 이 문제는 콜백 함수에서 매개변수에 오류를 던지는 것으로 해결될 수 있습니다

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이고 두 번째 매개변수가 결과라고 규정하고 있습니다! 첫 번째 매개변수가 비어 있지 않으면 비동기 호출에 오류가 있는 것입니다!

비동기 프로세스 제어 문제

콜백 지옥

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("三轮面试都成功了!啊哈哈哈!");
    });
  });
});

위의 비동기 프로세스가 세 개의 레이어에 포함되어 있는 것을 볼 수 있습니다. , 이것은 코드가 비교적 간단한 경우입니다! 그래서 실제 애플리케이션에서는 각각의 중첩된 함수가 매우 복잡하여 개발 및 유지 관리가 어렵고, 보고 있으면 사람들이 화를 내는 일명 **콜백 지옥**

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 wait🎜 🎜🎜더 보기 프로그래밍 관련 지식을 더 보려면 🎜프로그래밍 비디오🎜를 방문하세요! ! 🎜

위 내용은 Node.js 비동기 프로그래밍의 콜백에 대한 심층 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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