2014-12-09 2 views
1

를 해결 : 방법 findNumbers는 SQL 데이터베이스를 조회하고, 뒤에서는블록은 다음과 커피 스크립트 코드를 감안할 때

for groupID, groupObj of @cache.groups 

    #do some other stuff 

    #calling this function which is returning a promise 
    @callcounter.findNumbers(groupID) 
    .then (result) => 
    @cache.groups[groupID].someValue = result.someValue 

(동시 쿼리를 지원하지 않는, 지루한 사용) 및 (약속을 반환 라이브러리 : Q)

따라서 코드 실행은 이전 약속이 확정 될 때까지 for -loop의 다음 반복으로 진행되지 않습니다.

어떻게하면 적절하게 수행 할 수 있습니까?

+0

질문을 downvoted 된 이유를 물어 될까요? – Atmocreations

답변

0

findNumbers으로 전화하는 것이 순차적으로 이루어지기 만하면됩니다. 맞습니까? 약속을 맺으면됩니다.

중요 : [] .forEach가 아닌 명령형 루프를 사용하고 있으므로 groupIDgroupObject 개의 변수를 범위 지정해야합니다.

globalPromise = null 

createScopedPromiseFn = (groupID, groupObject) => 
    return -> 
    @callcounter.findNumbers(groupID).then (result) => 
     @cache.groups[groupID].someValue = result.someValue 

for groupID, groupObj of @cache.groups 
    createPromise = createScopedPromiseFn groupID, groupObj 
    # The if here is for initialisation 
    globalPromise = if globalPromise then globalPromise.then createPromise() else createPromise() 

globalPromise.then -> 
    # Here you have finished 

이 코드에서 for 루프는 제한없이 반복되지만 약속은 실제로 순차적으로 해결됩니다.

그러나, 나는 대신 reduce와 기능적 접근을하는 것이 좋습니다 것입니다 :

createScopedPromise = (groupIndex, group) => 
    @callcounter.findNumbers(groupIndex).then (result) => 
    @cache.groups[groupIndex].someValue = result.someValue 

globalPromise = @cache.groups.reduce (promise, group, index) -> 
    if promise 
    return promise.then -> 
     createScopedPromise index, group 
    else # First promise 
    return createScopedPromise index, group 

globalPromise.then -> 
    # Here you have finished 
+0

감사합니다. 기능적인 접근 방식이 유망 해 보인다. 하나의 단점이 있습니다. 그것은 같은'reduce '에서''다른 것들'을하지 말아야 할 것 같습니다. 실제로, 나는하기가 쉽기 때문에 이것을하고 있습니다. 하지만 당신의 기능적 접근 방식에서 똑같은 일을하는 것은 나에게 잘못된 것처럼 보입니다. – Atmocreations

+0

forEach/반복으로 반복합니다. 괜찮아. –

+0

이것은 트릭을 만들었습니다. 고맙습니다! – Atmocreations