어떻게 JavaScipt를 통해 지옥에서 탈출을 약속합니까

7942 단어 beginnersjavascript
무엇이 지옥이고, 무엇이 약속인가??이 문제들을 깊이 연구하려면 자바스크립트 호출 창고에 대한 기본적인 이해가 필요합니다. 따라서 저는 우선 이 방면의 상세한 정보를 간단하게 소개한 다음에 지옥을 통과하도록 안내하겠습니다.

야수의 본성


JavaScript는 단일 스레드 언어로, 한 번에 코드 한 줄만 실행할 수 있는 호출 스택만 있다는 것을 의미합니다.
호출 창고는 기본적으로 데이터 구조로 프로그램이 다음에 실행해야 할 내용을 추적하는 데 사용된다.그것은 선진적인 선출 규칙을 따른다.
한 걸음 한 걸음 함수 호출을 실행하면 창고 꼭대기에 추가되고 함수로 되돌아와 창고 꼭대기에서 팝업됩니다.
너는 그 밑에 있는 와플 더미를 잡지 못할 거야.JavaScript도 할 수 없습니다.

예, Javascipt에 호출 스택이 있습니다.이것은 실제로 코드를 작성하는 것을 간단하게 합니다. 왜냐하면 병발성 문제를 걱정하거나 여러 개의 계산이 동시에 발생할 필요가 없기 때문입니다.
너무 좋아요.
...네가 일이 동시에 일어나기를 바라지 않는다면.예를 들어 네트워크에 수십 차례 비동기적으로 호출되는 웹 응용 프로그램을 작성합니다. 응답을 기다리기 위해 나머지 코드의 실행을 멈추고 싶지 않습니다.이런 상황이 발생할 때, 그것은 이벤트 순환을 멈추거나'주 루틴'이라고 불린다.

지옥으로 돌아가다


JavaScript 단일 스레드 문제를 해결하는 첫 번째 해결 방안은 함수를 리셋으로 끼워 넣는 것이다.
그것은 임무를 완수했지만, 현재 범위와 사용 가능한 변수를 확정하는 것은 매우 도전적이고 낙담할 수 있다.
이것은 단지 너로 하여금

이렇게 많은 함수를 끼워 넣었을 때, 안개 속에서 잃어버렸다는 것을 알게 될 것이다. 이것이 바로 이른바 회조 지옥이다.이것은 너무 무서워서 아무도 거기에 가고 싶지 않다!
플러그 리셋은 뚜렷한 피라미드 모양을 형성하는 경향이 있다 -
fightTheDemogorgon(function(result) {
  rollForDamage(result, function(seasonsLeft) {
    closeTheGate(seasonsLeft, function(finalResult) {
      console.log('Hawkins is safe for ' + finalResult + ' more seasons.');
    }, failureCallback);
  }, failureCallback);
}, failureCallback);
이런 상황이 더욱 진일보할 것이라고 상상하고 10개에서 15개의 플러그인 함수를 호출한다.무섭지??
JavaScript 개발자들은 이것이 문제라는 것을 깨닫고 약속을 했다.
ES6(2015)에서 Promise는 이벤트 순환을 중단하지 않고 비동기 함수를 포맷하는 대체 방법입니다.그것은 미래의 결과를 나타내는 특수한promise 대상을 되돌려줍니다.

무슨 차이가 있습니까?


많은 것이 포맷되어 있다.
리셋은 함수를 매개 변수로 하고 실행 중인 함수에게 비동기 작업이 끝날 때 무엇을 해야 하는지 알려 줍니다.
다른 한편, 약속은 즉시 특수한 약속 대상으로 돌아간다.그것들은 함수 파라미터가 필요하지 않기 때문에 끼워 넣을 필요가 없다.
then () 이라는 promise 방법을 사용하여 비동기 작업이 끝날 때 사용할 동작을 제공합니다.

쇠사슬은 우정의 힘이라고도 부른다



Promises의 진정한 경외로운 점은 우리가 두 개 이상의 비동기적인 조작을 배후에서 수행해야 할 때, then () 방법으로 그것들을 연결할 수 있다는 것이다.
모든 chained then () 함수는 원본과 다른 새로운 약속을 되돌려줍니다. 이것은 체인의 다른 비동기적인 단계의 완성을 나타냅니다.
너는 기본적으로 이렇게 읽을 수 있다. 그리고 이것을 하고, 그리고 이것을 할 수 있다.
catch () 방법이 하나 더 있다고 약속합니다.catch () 를 체인의 끝에 연결하면 체인에서 실패한 약속의 오류를 제공합니다.체인에 장애가 발생할 때 취해야 할 조작을 설정하는 것도 유용하다.
약속 체인은 우리가 얄미운 끼워 넣는 리셋 모드에서 벗어나 자바스크립트 코드를 더욱 읽을 수 있는 형식으로 편평하게 할 수 있도록 한다.
fightTheDemogorgon()
.then(function(result) {
  return rollForDamage(result);
})
.then(function(seasonsLeft) {
  return closeTheGateIn(seasonsLeft);
})
.then(function(finalResult) {
  console.log('Hawkins is safe for ' + finalResult + ' more seasons.');
})
.catch(failureCallback);
ES6 구문을 사용하면 우리는 그것을 더욱 압축할 수 있습니다!
fightTheDemogorgon()
.then((result) => rollForDamage(result))
.then((seasonsLeft) => closeTheGateIn(seasonsLeft))
.then((finalResult) => console.log('Hawkins is safe for ' + finalResult + ' more seasons.'))
.catch(failureCallback);

야수를 물리치고 지옥을 탈출하다


이곳의 야수는 비동기적으로 사용되고, 지옥은 회전지옥이다.
전형적인 리셋 방식으로 Promise 함수를 끼워 넣는 것을 막을 수 있는 것은 없습니다.하지만 이건 필요 없어!이것은 통상적으로 의외의 자아로 인해 생긴 것이지만, 약속에 대한 익숙함이 부족할 뿐이다.
너는 약속을 화려한 새 옷을 입은 반격으로 상상할 수 있다.그것은 비동기 코드를 더욱 깨끗하게 보이고 사용하기 쉽고 읽을 수 있게 한다. 가장 중요한 것은 비동기 코드가 당신에게 지옥에서 돌아갈 수 있는 방법을 제공한다는 것이다.

ES8(2017)에는 비동기식/대기 모드라는 업데이트 방법이 도입되었습니다.이리 와봐!

읽어주셔서 감사합니다!


참고 문헌:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise

좋은 웹페이지 즐겨찾기