동기와 비동기 함수 조합

함수 조합이 무엇입니까
  • 간단한 함수 작성
  • 비동기 함수 작성
  • 이 단문에서, 나는 함수 조합과 함수 조합이 어떻게 비동기 코드와 함께 작동하는지 토론할 것이다.나는 그것의 기본 원리를 설명하고 몇 가지 예를 제시할 것이다.

    함수 작성 소개
    Javascript는 기능이 좋은 언어입니다.우리가 자주 하는 것은 여러 함수를 순서대로 응용하는 것이다.어떤 사람들은 우리가 링크 함수라고 말할 수 있기 때문에 pipe라는 조작부호를 자주 사용하거나, 어떤 사람들은 우리가 함수를 조합하고 있다고 말할 수 있다.이것은 명확하게 정의된 흐름 제어를 허용하고 건장하고 테스트 가능한 코드에 기반을 마련한다.
    h(g(f(x)))
    
    //logical representation
    x -> f -> g -> h
    
    우리는 x부터 함수 f, g, h를 순서대로 응용한다.함수 조합은 교환할 수 있는 것이 아니기 때문에 (비록 일부 함수는 교환할 수 있지만) 우리가 함수를 응용하는 순서가 매우 중요하다.이 항목에 대한 자세한 내용은 을 참조하십시오.
    문장 밑바닥의 출처는

    JavaScript로 함수 작성
    이 절에서는 JavaScript의 기본 함수 조합에서 더 튼튼한 방법으로 넘어갑니다.
    동기화 함수를 사용한 함수 조합의 예:
    const double = x => x + x;
    const square = x => x * x;
    const half = x => x / 2;
    
    const dsh = (x) => half(square(double(x)))
    
    이것은 좋지만, 우리가 약간 복잡한 논리를 가지고 있을 때, 분명히 이해하기 어렵다.
    예를 들면 다음과 같습니다.
    const hardToRead = (x) => cleanup(Calculate(params)(evaluate['@@space'](env)(getResult(x))))
    
    설령 우리가 정리를 해 보더라도 읽기는 이미 매우 어렵다.
    const hardToRead = (x) => cleanup(
      Calculate(params)(
        evaluate['@@space'](env)(
          getResult(x)
        )
      )
    )
    
    그것에게 약간의 패션 감각을 주기 위해서 우리는 반드시 약간의 피면 규칙을 깨야 한다.
    const hardToRead = (x) => cleanup(
      Calculate(params)(
      evaluate['@@space'](env)(
      getResult(x)
    )))
    // calling the function
    hardToRead(x)
    
    그것은 보기에는 괜찮지만 결점이 거의 없다.우리는 아래에서 위로 읽어야 한다. 이것은 약간 직감에 어긋나고, 형식도 매우 유연하지 않다.만약 우리가 정리 작업 후에 몇 가지 내용을 추가하기로 결정한다면 어떻게 해야 합니까?우리 이렇게 다시 써야 돼요?
    const hardToRead = (x) => logIt(
      cleanup(
      Calculate(params)(
      evaluate['@@space'](env)(
      getResult(x)
    ))))
    
    // calling the function
    hardToRead(x)
    
    비록 우리는 마지막 괄호의 수량에 주의해야 하지만, 이 모든 것은 가능하다.
    그러나 우리는 더 많은 일을 할 수 있다. 우리는 함수 조합을 돕는 조수 함수를 도입할 수 있다.이렇게 하면 위의 코드는 다음과 같습니다.
    const hardToRead = pipe(
      getResult,
      evaluate(env),
      calculate(params),
      cleanup,
      logIt // now adding extra functionality does not require a lot of rewritting
    )
    // calling the function
    hardToRead(x)
    
    보조 합성 기능의 장점은 명백히 알 수 있다.문법이 훨씬 깨끗해야 한다.우리는 위에서 아래로 단계를 읽을 수 있으며, 마지막 끝 괄호를 계산하지 않고 모든 단계를 추가하고 삭제할 수 있다.
    그 밖에 함수 파이프는 이른바 고급 함수다.그것은 이름, 전달, 즉석에서 실행할 수 있는 다른 함수를 되돌려줍니다.
    백엔드에서 파이프 함수는 사실상 매우 간단하며, 그 기능은 기본적으로 순서 호출 함수와 같다.이 가능하다, ~할 수 있다,...
    function pipe(...fns) {
      return function(arg) {
        return fns.reduce((acc, fn) => {
          return fn(acc);
        }, arg)
      }
    }
    
    실제적으로 함수 조합은 자바스크립트에 구축되어 개념적으로 함수 집합과 초기 매개 변수를 새로운 값으로 축소하는 것으로 볼 수 있다.
    기본적으로 우리가 하는 일은 이전 작업의 출력 값을 다음 작업의 입력 값으로 하는 것이다. 마치 시작할 때의 설명도와 같다.결국 우리는 최종 결과를 얻었다.

    비동기 코드
    때때로, 동기화 작업만 작성하는 것은 우리를 너무 멀리 가지 못하게 한다.JavaScript는 이벤트 제어 프로그래밍 언어로 비동기식 작업이 핵심입니다.
    비동기 코드를 작성하는 것도 의외로 단도직입적이다.
    우리는 기존의 공통된 구조인 약속을 이용할 수 있다.
    비동기식 환경에서 언급된 코드는 다음과 같이 작성할 수 있습니다.
    getResult(url)
    .then(evaluate(env))
    .then(calculate(params))
    .then(cleanup)
    
    이것은 이미 상당히 괜찮다. 나 개인적으로는 가능한 한 그것을 많이 사용할 것이다.그러면 우리는 다른 방법으로 비동기 함수를 조합해야 합니까?
    설명 좀 할게요.때때로, 우리는 정적 계산 기간에 심지어 알 수 없는 독특한 함수 서열을 정의해야 한다.예를 들어, 실행하려는 실행 경로 중 하나에서 다음을 수행합니다.
    getResult > eval_1 > eval_2 > calculate(param) > cleanup
    
    우리가 원하는 또 다른 길에서:
    getResult > eval_1> eval_2 > eval_3 > calculate(param) > cleanup
    
    또는 다른 곳에서:
    getResult > eval_1> .... > eval_N > calculate(param) > cleanup
    
    그 밖에 우리는 또 다른 동적 방식으로 조합 작업의 수량과 순서를 정의할 수 있다.
    링크 약속이 번거로워질 수 있음을 쉽게 알 수 있습니다. 조합을 만드는 데 도움이 필요합니다.우리는 동기화 부분pipe 함수를 가져와 조정할 수 있다.또는 더 많습니다. 현재의 실현은waitinArray.reduce을 지원하지 않기 때문입니다.그러나 비동기 블록에서wait 키워드를 호출하면 일반적인 순환은promise 해석을 기다립니다.다음과 같은 이점을 누릴 수 있습니다.
    function asyncPipe(...fns) {
      return async function(arg) {
        let res = arg;
        for (fn of fns) {
          res = await fn(res);
        }
        return res;
      }
    }
    
    이 실현 중인 파이프 함수는 동기화와 비동기화 함수를 동시에 받아들일 수 있습니다.
    이러한 과제를 해결하기 위해 다음과 같은 방법을 사용할 수 있습니다.
    const path = [method1, method2, ..., methodN];
    const doPath = (path:Array<Function>) => pipe(
      getResult,
      ...path,
      calculate(params),
      cleanup
    )
    
    const myUniquePath = doPath(path)
    
    현재, 컴파일할 때 필요한 조작 집합을 알지 못할 때, 우리는 실행할 때 약속한 함수를 쉽게 연결할 수 있다.

    예외 처리?
    그럼 덩어리를 잡을까요?우리 뭐 잊었어?문제가 발생하면 실패한 경로 옵션을 제공해야 합니다. 어떻게 해야 합니까?
    여기 뉴스 없어요.비동기 함수는 약속을 되돌려 주는 함수일 뿐이기 때문에 우리는 두 가지 주요한 처리 방법이 있다.
  • promises
  • 의 전통 포획 블록
  • 비동기 코드 블록에서try-catch 구조를 선택할 수 있습니다.
  • doPath(url)
    .then(result => { doSomethingWithResult(result) })
    .catch(error => { doSomethingWithError(error) })
    
    또는
    async asyncBock() {
      try {
        let res = await doPath(url)
        doSomethingWithResult(res)
      } catch(e) {
        doSomethingWithError(e)
      }
    }
    

    함수 조합의 장점 사용하기
    함수식 프로그래밍의 이상적인 세계에서 함수와 운행 환경은 완전히 결합된다.이것은 테스트를 매우 쉽게 한다. 왜냐하면 시뮬레이션 환경에서 함수를 집행하는 방식은 거의 차이가 없기 때문이다
    테스트 환경, 개발 환경과 생산 환경.함수의 행위는 완전히 같다.
    논리를 독립된 단계로 나누면 이 절차를 더욱 복잡한 조작으로 조합할 수 있고 구축 과정의 복잡성을 증가시키지 않으며 테스트 환경의 복잡성을 증가시키지 않는다.

    결론
    함수 조합은 함수 프로그래밍의 초석 중의 하나다.본고에서 우리는 함수 조합의 기본 규칙을 설명하고 동기 함수와 비동기 함수의 조합을 어떻게 응용하는지 보여 주었다.또한 내장된 JavaScript 언어를 이용한 기본적인 구현 세부 사항도 간략하게 설명합니다.
    구조

    한층 더 읽다
    많은 기존 라이브러리에서 파이프나 함수 조합의 형상을 제공한다.나는 성공적으로 사용했다ramda.
    다른 사람들은 이에 만족한다lodash/fp
    만약 토론에 흥미가 있다면, 파이프를 자바스크립트 문법의 일부로 삼는 것을 제안하는 사람이 있다.hackpipes .

    출처
    function composition
    ramda
    hackpipes

    좋은 웹페이지 즐겨찾기