等待 forEach 循环
Posted
技术标签:
【中文标题】等待 forEach 循环【英文标题】:Await forEach loop 【发布时间】:2020-05-09 01:59:26 【问题描述】:我有一个快速端点,它可以做很多事情,其中之一是根据 GoDaddy 的 API 检查域名可用性。我不明白如何才能等待结果。
循环将迭代我的tlds
数组并检查每个人的域名可用性。目前axios会从checkDomainAvailability
返回一个promise,解析,并将数据推送到domains
数组中(我敢肯定这可以写得更好,但我不精通JS)。
app.post("/domains", async (req, res) =>
var brand = req.body.brand;
let domains = [];
// check domain availability
const tlds = ["dev", "com", "tv", "io", "app", "me"];
tlds.forEach(tld =>
let domain = `$brand.$tld`;
godaddy.checkDomainAvailability(domain).then(data =>
domains.push(data);
);
);
res.send(domains);
godaddy.checkDomainAvailability()
const checkDomainAvailability = function(domain)
return api
.get("/domains/available",
params:
domain: domain,
checkType: "FULL",
forTransfer: false
)
.then(res =>
return res.data;
)
.catch(err =>
logger.error("Godaddy", err);
);
;
当前的结果显然是 express 在每个迭代之前发送域的结果。我怎样才能让它?
我尝试如下使用for await
,但看到了相同的结果。
// check domain availability
const tlds = ["dev", "com", "tv", "io", "app", "me"];
for await (let tld of tlds)
let domain = `$brand.$tld`;
godaddy.checkDomainAvailability(domain).then(data =>
domains.push(data);
);
【问题讨论】:
你可能想试试for await...of
或Bluebird Promise.reduce
看看这个问题和答案,我认为它会帮助你指出正确的方向。 ***.com/questions/31413749/…
@user1538301 我确实用for await
尝试过这个,但仍然看到相同的结果。我会尝试编辑。
【参考方案1】:
这里最简单的解决方案是将循环逻辑封装在另一个 (async
) 函数中,然后将 await
该函数的结果封装到您的主代码集中。例如:
app.post("/domains", async (req, res) =>
var brand = req.body.brand;
// check domain availability
const tlds = ["dev", "com", "tv", "io", "app", "me"];
let domains = await checkTLDs(tlds, brand);
res.send(domains);
这里,checkTLDs()
是一个处理循环的async
函数。然后,您的主代码可以等待它完成,然后再执行res.send()
。
【讨论】:
以上是关于等待 forEach 循环的主要内容,如果未能解决你的问题,请参考以下文章
ForEach 循环中的异步/等待节点 Postgres 查询
当我使用 for 循环时,为啥我的代码没有在 forEach 中等待? [复制]