挣扎于js承诺,foreach承诺添加结果。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了挣扎于js承诺,foreach承诺添加结果。相关的知识,希望对你有一定的参考价值。

谁能帮我解决这个问题,我想检索一下用webrtc发送了多少数据。但我无法理解这些承诺。

我需要遍历发送者列表,但对于每个发送者,我需要等待承诺,然后才能继续下一个发送者。

// Reset datacounter
Client.DataUsed = 0;

// Get senders (audio/video)
const senders = Client.WebcamConnection.getSenders();

// Iterate through senders
senders.forEach(sender => 
    // Get the stats then await the promise using then
    sender.getStats().then(stat => 
        // Iterate through raports of stat
        stat.forEach(report => 
            // Check if is the right raport
            if (report.type === 'outbound-rtp') 
                // Add the byte count to the datacounter
                Client.DataUsed += report.bytesSent + report.headerBytesSent;
            
        );
    );
);

// Do something with the Client.DataUsed
答案

就像你说的,你不能使用结果,直到所有的承诺被解决。你可以使用 Promise.all 伺机而动 *** 评论:

// Reset datacounter
Client.DataUsed = 0;

// Get senders (audio/video)
const senders = Client.WebcamConnection.getSenders();

// ***Create an array of promises, one for each sender, and pass it into
// `Promise.all`***
Promise.all(senders.map(sender => 
    // *** Return the promise created by `then` so `Promise.all` can
    // wait for it***
    // Get the stats then await the promise using then
    return sender.getStats().then(stat => 
        // Iterate through raports of stat
        stat.forEach(report => 
            // Check if is the right raport
            if (report.type === 'outbound-rtp') 
                // Add the byte count to the datacounter
                Client.DataUsed += report.bytesSent + report.headerBytesSent;
            
        );
    );
)
.then(() => 
    // Do something with the Client.DataUsed
)
.catch(error => 
    // Handle/report error
);

以上是关于挣扎于js承诺,foreach承诺添加结果。的主要内容,如果未能解决你的问题,请参考以下文章

带有多个猫鼬查找的foreach循环后的javascript承诺

forEach 的简单承诺

等待内部带有承诺的 forEach 完成

如何在 node.js 中解决可变数量的承诺

在承诺完成之前退出 forEach

异步 redis 和承诺