我有一个for循环
for (let i = 0; i < options.length; i++) {
console.log("Entered the to for " + i);
let employee = await this.prolesChecker.getEmployeesFromEmail(options[i]);
let isOnVacation = await this.prolesChecker.isOnVacation(employee, moment());
}
两个函数“getEmployeesFromEmail和isOnVacation”正在连接到数据库,它们需要一些时间才能返回结果。 我希望for循环等到返回结果然后进入下一次迭代。
作为示例,console.log始终打印
Entered the to for 0
它永远不会进入i = 1
这是函数
public async deleteEmailsTo(options: any) {
console.log(options.length);
for (let i = 0; i < options.length; i++) {
console.log("Entered the to for " + i);
let employee = await this.prolesChecker.getEmployeesFromEmail(options[i]);
let isOnVacation = await this.prolesChecker.isOnVacation(employee, moment());
if ((!employee.EmailReminders && !isOnVacation) || (!employee.EmailReminders && !employee.EmailRemindersForHoliday && isOnVacation)) {
let index = options.indexOf(options[i], 0);
if (index > -1) {
options.splice(index, 1);
console.log("Removed " + employee.Name + " " + employee.LastName + " from the 'to' list");
}
}
}
}
有什么建议吗?
答案 0 :(得分:1)
您的问题实际上与async
/ await
语法不同,后者运行正常。它是关于在迭代期间使用splice
的!这会改变数组的.length
,并且下一次迭代不会因为循环条件不再适用而不会发生。
如果您必须改变传递的数组,请递减index
计数器以考虑长度的变化:
for (let i = 0; i < options.length; i++) {
…
if (…) {
let index = i; // no point in using `options.indexOf(options[i], 0);`
// if (index > -1) { always true
options.splice(index--, 1);
// ^^^^^^^
}
}
但是简单地创建一个新数组可能要容易得多:
let result = [];
for (let i = 0; i < options.length; i++) {
…
if (!…) {
result.push(options[i]);
}
}
return result;