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