gpt4 book ai didi

javascript - While 在 Promise 的 .then() 内循环

转载 作者:太空宇宙 更新时间:2023-11-04 03:05:34 26 4
gpt4 key购买 nike

我正在尝试执行一些逻辑,它将编辑 minheap.heapList 的长度。我对 Promises 还很陌生,所以我不知道如何解决这个问题。在 while 循环 中,我还将调用一些 async 函数。不太确定如何正确处理竞争条件

    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

这是同步逻辑:

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;
}
}
}
}

最佳答案

为了将 promise 数组返回到Promise.all,您需要在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;
}))

关于javascript - While 在 Promise 的 .then() 内循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41908410/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com