我有一些代码大致如下:

function getRegionUsers(region) {
    return new Promise((resolve) => {
        setTimeout(() => {
            if (region === "emea") {
                return resolve(["dave", "mike", "steve"]);
            }
            return resolve(["kiki", "maya", "yukiko"]);
        }, 1000);
    });
}

function sendMail(user, region) {
    console.info(`sendMail called: ${user} (${region})`);
}

async function test() {
    const regions = ["emea", "apac"];
    for (const region of regions) {
        const users = await getRegionUsers(region); // This line is my issue
        for (const user of users) {
            sendMail(user, region);
        }
    }
}
test();

您可以忽略前两个函数,它们只是帮助说明问题.问题是第三个函数导致了一个linter错误(eslint: no-await-in-loop),这很有意义,因为等待将延迟for循环每次迭代的执行.

我一直看到的解决方案是使用Promise.all,这很好,但我需要跟踪两个用户and region,以便将其传递给sendMail函数.因此,我最终得出这样的结论:

async function test() {
    const regions = ["emea", "apac"];

    const userPromises = regions.map((r) => getRegionUsers(r));
    const regionUsers = await Promise.all(userPromises);

    for (const [i, region] of regions.entries()) {
        for (const user of regionUsers[i]) {
            sendMail(user, region);
        }
    }
}
test();

这看起来既混乱又不雅观,因为我基本上复制了区域for循环,而且很难遵循.一旦您处理错误捕获,或者如果您有另一个或两个嵌套for循环,它也会变得更加混乱.

有没有人有更优雅的解决方案(除了告诉ESLint忽略这行之外),即使这只是一种更简洁的书写方式?

推荐答案

我将使用异步函数映射这些区域.异步函数总是返回一个promise (无需添加显式return语句).Promise.all的promise 可以期待.

async function test() {
    const regions = ["emea", "apac"];

    const promises = regions.map(async region => {
        const users = await getRegionUsers(region);
        for (const user of users) {
            sendMail(user, region);
        }
    });
    await Promise.all(promises);
}

这将修复no-await-in-loop报告的问题.

Javascript相关问答推荐

使用续集和下拉栏显示模型属性

如何解决CORS政策的问题

Spring boot JSON解析错误:意外字符错误

在服务器上放置了Create Reaction App Build之后的空白页面

当试图显示小部件时,使用者会出现JavaScript错误.

如何调用名称在字符串中的实例方法?

如何控制Reaction路由加载器中的错误状态?

如何在ASP.NET项目中使用Google Chart API JavaScript将二次轴线值格式化为百分比

如何将数据块添加到d3力有向图中?

使用类型:assets资源 /资源&时,webpack的配置对象&无效

如何在Java脚本中对列表中的特定元素进行排序?

WebSocketException:远程方在未完成关闭握手的情况下关闭了WebSocket连接.&#三十九岁;

用于部分字符串的JavaScript数组搜索

Pevent触发material 用户界面数据网格中的自动保存

如何正确地在ComponentWillUnmount中卸载状态以避免内存泄漏?

如何使用Cypress在IFRAME中打字

通过ng-绑定-html使用插入的HTML中的函数

react :图表负片区域不同 colored颜色

如何使用Angular JS双击按钮

在使用Jest进行测试时,在Express应用程序中未定义Multer