2017-01-28 1 views
0

길이가 minheap.heapList 인 부분을 편집하려고합니다. 나는 이것에 접근하는 확실하지 않다 그래서 나는 Promises에 새롭게이다. while loop 내에서 일부 전화는 async입니다. 제대로 이것의 목표는 비동기로 내 동기 코드를 변환하는 것입니다 경쟁 조건while 루프는 약속의 .then() 내에서

let minheap = new MinHeap(); 
    let i = 0; 
    Promise.all(logSources.map(logSource => { 
     logSource.popAsync().then(log => { 
      minheap.insert({ 
       ts: log.date.getTime(), 
       source: i++, 
       data: log 
      }) 
     }); 
     i += 1; 
    })).then(
     while(minheap.heapList.length) { 
      ... 
      // async logic 
      ... 
     } 
    ); 

를 처리하는 방법을 아주 확실하지. 내 동기 코드의 .pop().popAsync()으로 바뀌고 promise을 반환합니다.

Promise.all에 약속의 배열을 반환하기 위해
const lenLogSources = logSources.length; 
let minheap = new MinHeap(); 
for (let i = 0; i < lenLogSources; i++) { 
    let log = logSources[i].pop(); 
    minheap.insert({ 
     ts: log.date.getTime(), 
     source: i, 
     data: log 
    }) 
} 
while (minheap.heapList.length) { 
    let heapNode = minheap.popMin(); 
    let currTimestamp = heapNode['ts']; 
    printer.print(heapNode.data); 
    let nextMinTimestamp = minheap.getPeakTimestamp(); 
    while (currTimestamp <= nextMinTimestamp) { 
     let log = logSources[heapNode['source']].pop(); 
     if (log) { 
      let logtime = log.date.getTime(); 
      if (logtime <= nextMinTimestamp) { 
       printer.print(log); 
       currTimestamp = logtime; 
      } else { 
       minheap.insert({ 
        ts: logtime, 
        source: heapNode["source"], 
        data: log 
       }); 
       break; 
      } 
     } else { 
      heapNode = minheap.popMin(); 
      printer.print(heapNode.data); 
      currTimestamp = heapNode['ts']; 
      if (minheap.heapList.length) { 
       nextMinTimestamp = minheap.getPeakTimestamp(); 
      } else { 
       while (true) { 
        let m = logSources[heapNode['source']].pop(); 
        if (m) { 
         printer.print(m); 
        } else { 
         console.log('Drained: ' + heapNode['source']); 
         break; 
        } 
       } 
       break; 
      } 
     } 
    } 
} 
+0

a) 루프 구조가 아닌'then'에 콜백을 전달해야합니다. b) 비동기 논리에서'while' 루프를 사용할 수 없습니다. 대신 재귀 적 접근법을 사용하십시오. – Bergi

답변

2

, 당신은 mapreturn 필요 :

Promise.all(logSources.map(logSource => { 
    const logSourcePromise = logSource.popAsync().then(log => { 
     minheap.insert({ 
      ts: log.date.getTime(), 
      source: i++, 
      data: log 
     }) 
    }); 
    i += 1; 
    return logSourcePromise; 
})) 
2

귀하의 질문이 좀 불분명 여기

는 동기 논리입니다 하지만 다음과 같이 할 수 있습니다.

processNode 함수 자체가 비동기적일 수 있습니다.

이렇게하면 source의 값이 결정적 순서로 할당되지 않습니다.

편집 :

대답 here 내 대답의 개선을 제안했다.

+0

은이 접근 방식으로 스택 공간이 부족할 수 있습니까? 많은 수의'logSources'를 위해서? – Liondancer

+2

@Liondancer - 우선 : 멋진 사용자 이름입니다. 둘째로, 나는 이것을 재귀 적으로 알지만, 그렇지 않습니다. 'fcn()'자체는 호출하지 않고 비동기 콜백을 호출합니다. 실제 스택은 커지지 않지만 스택과 같은 연결된 클로저 목록이 힙에 만들어집니다. – Malvolio

+0

아직도 고착 = [제발 좀 봐주실 수 있습니까? http://dpaste.com/3ZDGAAZ 제안하신대로 따라 가려고합니다. 현재'fail '무한한 출력을 얻는다. – Liondancer

관련 문제