복붙노트

[NODEJS] 때 국지적 인 (성공, 실패) 약속에 대한 안티 패턴으로 간주됩니다?

NODEJS

때 국지적 인 (성공, 실패) 약속에 대한 안티 패턴으로 간주됩니다?

해결법

  1. ==============================

    1.그 때는 () 호출은 콜백에서 오류가 발생하는 경우에 거부됩니다 약속을 반환합니다. 당신의 성공 로거가 실패 할 때이 방법은 오류가 아니라 성공을 함께가는 실패 콜백 다음 .catch () 콜백에 전달 될 것이다.

    그 때는 () 호출은 콜백에서 오류가 발생하는 경우에 거부됩니다 약속을 반환합니다. 당신의 성공 로거가 실패 할 때이 방법은 오류가 아니라 성공을 함께가는 실패 콜백 다음 .catch () 콜백에 전달 될 것이다.

    여기서 제어 흐름도이다 :

    동기 코드에 그것을 표현하는 방법 :

    // some_promise_call().then(logger.log, logger.log)
    then: {
        try {
            var results = some_call();
        } catch(e) {
            logger.log(e);
            break then;
        } // else
            logger.log(results);
    }
    

    제 로그 (그 때는 내지 제 인수처럼 ()) 만 예외 일어나지 경우에 실행된다. 표지 블록과 break 문이 실제로 어떤 파이썬 것은 시도-제외 - 다른 사람에 대한이, 홀수 비트를 느낄 (권장 독서를!).

    // some_promise_call().then(logger.log).catch(logger.log)
    try {
        var results = some_call();
        logger.log(results);
    } catch(e) {
        logger.log(e);
    }
    

    캐치 로거는 성공 로거 호출에서 예외를 처리합니다.

    그래서 많은 차이.

    인수는 일반적으로 당신이 처리의 모든 단계에서 오류를 포착 할 것입니다, 그리고 당신은 체인에서 사용해서는 안된다. 당신은 "안티 패턴"당시 콜백의 일부에 오류가 처리되지 사용할 때, 잠시 - 기대 당신은 모든 오류를 처리 한 최종 핸들러를 가지고있다.

    정확히이 단계에서 발생한 오류를 처리 할 때, 당신은 오류가 발생하지 않을 때 완전히 다른 무언가를 할 - 오류가 복구 할 수없는 경우 즉 그러나,이 패턴은 실제로 매우 유용합니다. 이 귀하의 제어 흐름을 분기 것을 알고 있어야합니다. 물론, 이것은 때때로 바람직하다.

    당신은 당신의 콜백을 반복했다. 당신은 오히려 원하는

    some_promise_call()
       .catch(function(e) {
           return e; // it's OK, we'll just log it
       })
       .done(function(res) {
           logger.log(res);
       });
    

    또한이를 위해 () .finally 사용하는 것이 좋습니다.

  2. ==============================

    2.두 사람은 아주 동일하지 않습니다. 차이는 첫 번째 예는 성공 핸들러에 던져있어 예외를 잡을 것입니다. 자주의 경우와 같이 당신의 방법은 오직 해결 약속을 반환해야합니다 그래서, 당신은 (빈 성공 매개 변수 또는 아직 다음 다른) 후행 캐치 처리기가 필요합니다. 물론, 그것은 당신의 다음 핸들러가 다음 잘 될 수있는 한 2 매개 변수를 사용하는 경우 잠재적으로 실패 할 수 있습니다 아무것도 수행하지 않습니다 수 있습니다.

    두 사람은 아주 동일하지 않습니다. 차이는 첫 번째 예는 성공 핸들러에 던져있어 예외를 잡을 것입니다. 자주의 경우와 같이 당신의 방법은 오직 해결 약속을 반환해야합니다 그래서, 당신은 (빈 성공 매개 변수 또는 아직 다음 다른) 후행 캐치 처리기가 필요합니다. 물론, 그것은 당신의 다음 핸들러가 다음 잘 될 수있는 한 2 매개 변수를 사용하는 경우 잠재적으로 실패 할 수 있습니다 아무것도 수행하지 않습니다 수 있습니다.

    그러나 나는 당신이 링크 텍스트의 요점은 다음 즉 체인 능력 비동기 단계의 무리, 그리고 당신이 실제로이 작업을 수행 할 때, 다음의 2 매개 변수 양식이 미묘하게 확실히 작동하지 않습니다에 콜백 대 대부분 유용하다 생각 로 위의 이유로, 예상. 그것은 특히 사용되는 중간 체인을 직관적입니다.

    내가 인정하는 걱정보다이 같은 모서리에 복잡한 비동기 물건을 많이 수행하고 충돌하는 사람으로서, 나는 정말이 안티 패턴을 피하고 별도의 핸들러 접근 방식으로가는 것이 좋습니다.

  3. ==============================

    3.장점과 양쪽의 단점을 살펴보면 우리는 상황에 적합한으로되는 계산 된 추측을 할 수있다. 이러한 구현의 약속에 대한 두 가지 방법을 제공합니다. 모두 그것의 흑자와 마이너스가

    장점과 양쪽의 단점을 살펴보면 우리는 상황에 적합한으로되는 계산 된 추측을 할 수있다. 이러한 구현의 약속에 대한 두 가지 방법을 제공합니다. 모두 그것의 흑자와 마이너스가

    some_promise_call()
    .then(function(res) { logger.log(res) })
    .catch(function(err) { logger.log(err) })
    

    장점

    단점

    some_promise_call()
    .then(function success(res) { logger.log(res) },
          function error(err) { logger.log(err) })
    

    장점

    단점

  4. ==============================

    4.간단한 설명 :

    간단한 설명 :

    에서 ES2018

    그것의 의미는:

    promise.then(f1).catch(f2)
    

    등호

    promise.then(f1).then(undefiend, f2)
    
  5. ==============================

    5.그 때는 사용 (). 캐치 ()를 할 수 있습니다 당신은 워크 플로우를 수행하는 데 필요한 약속 체인 수 있습니다. 당신은 당신이 응답을 조작 할 비동기 API에 전달하려는 당신은 데이터베이스에서 몇 가지 정보를 읽어 들일 필요가 있습니다. 당신은 데이터베이스에 응답 다시 밀어 할 수 있습니다. 당신의 개념을 모든 워크 플로우를 취급 행할 수 있지만 관리하기가 매우 어렵다. 더 나은 해결책은 될 것입니다 (). 다음 (). 다음 (). 다음 (). 한 번만 캐치에 모든 오류를 수신 할 수 있습니다 캐치 () 당신은 코드의 유지 보수성을 유지한다.

    그 때는 사용 (). 캐치 ()를 할 수 있습니다 당신은 워크 플로우를 수행하는 데 필요한 약속 체인 수 있습니다. 당신은 당신이 응답을 조작 할 비동기 API에 전달하려는 당신은 데이터베이스에서 몇 가지 정보를 읽어 들일 필요가 있습니다. 당신은 데이터베이스에 응답 다시 밀어 할 수 있습니다. 당신의 개념을 모든 워크 플로우를 취급 행할 수 있지만 관리하기가 매우 어렵다. 더 나은 해결책은 될 것입니다 (). 다음 (). 다음 (). 다음 (). 한 번만 캐치에 모든 오류를 수신 할 수 있습니다 캐치 () 당신은 코드의 유지 보수성을 유지한다.

  6. ==============================

    6.다음 사용 ()와 캐치 ()는 promise.catch에 체인의 성공과 실패 핸들러 () 다음에 의해 반환 약속 ()에서 작동하는 데 도움이됩니다. 그것은 처리

    다음 사용 ()와 캐치 ()는 promise.catch에 체인의 성공과 실패 핸들러 () 다음에 의해 반환 약속 ()에서 작동하는 데 도움이됩니다. 그것은 처리

    약속 =이 : promiseRef하자 1. aTimetakingTask (FALSE); 2. promiseRef 3. 그 때는 ( 4. (결과) => { 5. / * 성공적으로 해결 약속. 여기에 데이터를 6 일 * / 7.} 8. (오차) => CONSOLE.LOG (오차) 9.) 10. .catch ((E) => { 11 / * 성공적으로 해결 약속. 여기에 데이터를 12 일 * / 13});

    콜백이 돌보는 경우 다음에 의해 반환 약속 () 오류를 가지고 있지 않기 때문에 의미가 있습니다.

  7. ==============================

    7.대신 단어, 좋은 예. (첫 번째 약속이 해결 된 경우) 코드를 다음과 같습니다

    대신 단어, 좋은 예. (첫 번째 약속이 해결 된 경우) 코드를 다음과 같습니다

    Promise.resolve()
    .then
    (
      () => { throw new Error('Error occurs'); },
      err => console.log('This error is caught:', err)
    );
    

    동일로는 :

    Promise.resolve()
    .catch
    (
      err => console.log('This error is caught:', err)
    )
    .then
    (
      () => { throw new Error('Error occurs'); }
    )
    

    그러나 거부 첫번째 약속이 동일되지 않습니다 :

    Promise.reject()
    .then
    (
      () => { throw new Error('Error occurs'); },
      err => console.log('This error is caught:', err)
    );
    
    Promise.reject()
    .catch
    (
      err => console.log('This error is caught:', err)
    )
    .then
    (
      () => { throw new Error('Error occurs'); }
    )
    
  8. from https://stackoverflow.com/questions/24662289/when-is-thensuccess-fail-considered-an-antipattern-for-promises by cc-by-sa and MIT license