2017-01-30 1 views
-1

내 약속 내에서 중첩 된 'while' 루프를 만들려고합니다. 내 innerFunc에서 문제가 생기면 log.asyncCall().then(...) IDE에서 내게 바로 말해서 화살표 기능이 .then()으로 바로 넘어 가서 return innerFunc()을 포함하고 if statement으로 가지 않아도됩니다. 경주 조건이 내가 원하는 순서대로 실행되지 않는다고 생각합니다. 내가 달성하기 위해 노력하고 무엇을약속 내에서 중첩 된 'while'루프 실행

요약 :

outerFunc에 따르면 나는 innerFunc이 3 번을 수행 할.

무엇 innerFunclognull이 아닌 한 계속해서 .asyncCall()을 호출합니다. innerFunclog을 생성 할 수 없으면 'while' 루프를 종료하십시오.

또한 약속을 디버깅하는 좋은 방법을 찾는 데 어려움을 겪고 있습니다. 현재 WebStorm과 함께 디버그 기능을 사용하고 있습니다.

var i = 0 
const outerFunc =() => { 
    return new Promise(resolve => { 
    if (i < 3) { 
     i++ 
     const innerFunc =() => { 
     return new Promise(resolve => { 
      return log.asyncCall().then(lg => { 
      if (lg) { 
       // some logic 
      } else { 
       resolve() 
      } 
      }).then(() => { 
      // continue iterating innerFunc() 
      return innerFunc(); 
      }); 
     }) 
     }; 
     // first iteration innerFunc() 
     return innerFunc().then(() => { 
     // once innerFunc() is complete, reiterate outerFunc() 
     return outerFunc(); 
     }); 
    } else { 
     resolve(); 
    } 
    }); 
} 
+1

NB를 (NB는 전달 함수는 약속을 리턴하지 않는 경우 repeatPromise 기능이 제대로 작동하지 작성된)'그 때는 (() =가> {innerFunc()를 호출}) '이고 '.then (innerFunc)' – Alnitak

+1

으로 더 잘 작성된 경우,'log.asyncCall'에서 사용 된'log' 변수가 이전 반복에서받은 값을 가지기를 기대합니까? (그렇지 않습니다) – Alnitak

+0

@Alnitak 변수 이름으로 죄송합니다. – Liondancer

답변

1

다른 약속으로 약속을 포장하기 때문에 Promise 방지 패턴을 사용하고 있습니다.

난 강력하게 내부 범위를 벗어난 innerFunc을 복용 조언한다, 따라서 다시 작성합니다 :

const doLogging =() => { 
    return log.asyncCall().then(result => { 
     if (result) { 
      // do stuff 
      ... 
      return doLogging(); 
     } 
    }); 
} 

else 지점에 대한 필요가 없습니다 - 내부 화살표 기능은 암시 적으로 다음 래핑됩니다 undefined를 반환합니다 약속에 .then.

는 그런 다음이 count 번 실행하려면 :

const repeatPromise = (f, count) => { 
    if (count > 0) { 
     return f().then(() => repeatPromise(f, count - 1)); 
    } else { 
     return Promise.resolve(); 
    } 
} 

const outerFunc =() => repeatPromise(doLogging, 3); 

이 기능에서 else 분기 최종 결과는 항상 약속 있는지 확인하는 것이 필요하다.

:

+0

@Liondancer 나는 거기에 갈만큼 충분하지 않습니다. FWIW, 위에서 작성한 내용을 테스트하기 위해 node.js 코드를 작성했는데 모두 작동했습니다. – Alnitak