[英]Wait for api response to be processed before iterating for loop
我正在尝试编写一个 Discord 机器人,它基本上使用 HTTP 请求检查每个 Discord 用户是否在会员数据库中具有有效会员资格(尚未过期)所以我写了如下内容
function checkmemberships() {
const memberships = fs.readFileSync('emailtest.txt').toString().toLowerCase().replace(/(?:\\[rn]|[\r\n]+)+/g, " ").split(" ");
const tenantId = 'example';
var today = new Date().toISOString().slice(0, 10);
for (i = 0; i < memberships.length; i += 3)
{
let contactId = memberships[i];
const membershipnumber = memberships[i + 1];
fetch(`https://rolodex.api.rhythmsoftware.com/contacts/${tenantId}/number/${contactId}`,
{
method: 'GET',
headers: {
'Content-Type': 'application/json',
'Authorization': global.apikey //this is generated somewhere else
},
}
)
.then((res) => res.json())
.then((res) => {
if (res.errorMessage == "RecordNotFound: Could not find a contact with the supplied number")
{
//Still To Do but not important
} else
{
if (res.id)
{
contactId = res.id; //Number can actually be different from what the user originally posts
fetch(`https://membership.api.rhythmsoftware.com/memberships/${tenantId}/contact/${contactId}`,
{
method: 'GET',
headers: {
'Content-Type': 'application/json',
'Authorization': global.apikey
},
}
)
.then((resp) => resp.json())
.then((resp) => {
console.log(resp);
if (resp.expiration_date)
{
let guild = client.guilds.cache.get('890266470641201172');
let member = guild.members.cache.get(membershipnumber); //At this point the membership isn't found because at this point it's undefined
if (resp.expiration_date <= today) {
member.roles.remove("890270511261696031");
member.roles.remove("890270660239175700");
}
}
})
}
}
})
}
}
这在检查一个成员资格时有效,但是当我开始引入其他成员资格时,我注意到 for 循环在我什至还没有得到第一个成员资格的响应之前就已经完成,此时不再定义成员资格。
我怎样才能更改上面的代码,以便 for 循环在执行下一次迭代之前等待 HTTP 响应被处理?
我会使用await fetch()
来确保 API 响应已完成,然后您才能对数据执行任何操作。 这将阻止您在响应完成之前处理数据。
因此,在您的情况下,您应该更改您的代码,以便您的 await fetch 首先在循环之外完成,这与您现在的方式相反。 这是一篇关于如何使用 Await Fetch 的非常好的文章。
https://dmitripavlutin.com/javascript-fetch-async-await/#2-fetching-json
在循环中等待将按顺序进行检查。 如果它们不相互依赖,则与 Promise.all 同时运行检查。
function checkmemberships() {
const memberships = fs.readFileSync('emailtest.txt').toString().toLowerCase().replace(/(?:\\[rn]|[\r\n]+)+/g, " ").split(" ");
const tenantId = 'example';
var today = new Date().toISOString().slice(0, 10);
let promises = [];
for (i = 0; i < memberships.length; i += 3) {
let contactId = memberships[i];
const membershipnumber = memberships[i + 1];
promises.push(checkMembership(tenentId, membershipnumber, today);
}
return Promise.all(promises);
}
function checkMembership(tenentId, membershipnumber, today) {
// .... from the op
return fetch(`https://rolodex.api.rhythmsoftware.com/contacts/${tenantId}/number/${contactId}`, // ...
// .then do json parse
// .then do expiration check
// return something, like a bool if the member is in good standing
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.