我有一些代码大致如下:
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忽略这行之外),即使这只是一种更简洁的书写方式?