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

标签 javascript node.js promise

我正在尝试执行一些逻辑,它将编辑 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/

相关文章:

javascript - 如何使用javascript在弹出框中显示消息

javascript - 使用 ScaleBand 从范围中获取域

node.js - sequelize 是否有自动迁移的工具?

javascript - 错误 : HTML onClick not defined with Node. js、NPM 和 Parcel

javascript - 这是处理 JavaScript Promise 的正确方法吗?

javascript - promise 所有并获得请求

javascript - Vue JS - indexOf 数组不是函数

javascript - 如何在动态操作中单击按钮时调用 Oracle APEX 中的 javascript 函数?

javascript - Socket.IO 命名空间,调用未定义的函数 .of()

angularjs - AngularJS 中使用 Promise 和 Defer 进行同步和异步调用